堆内存

java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 的区别

寵の児 提交于 2019-12-04 18:38:33
Eclipse崩溃,错误提示: MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remains. It is strongly recommended that you exit and restart MyEclipse with new virtual machine memory paramters to increase this memory. Failure to do so can result in data loss. The recommended Eclipse memory parameters are: eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 1.参数的含义 -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M -vmargs 说明后面是VM的参数,所以后面的其实都是JVM的参数了 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX

读书笔记之二:堆、方法区、运行时常量池和直接内存

早过忘川 提交于 2019-12-04 04:43:01
一、Java 堆 Java 堆(Heap)是 Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。但随着 JIT 编译器的发展与逃逸技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些变化发生,所有的对象并不都是一定分配在堆上。 为了更好的回收内存和分配内存,从内存回收的角度来看,Java 堆还可以细分新生代和老年代,对于新生代和老年代虚拟机一般都采用不同的垃圾回收算法;从内存分配的角度来看,线程共享的 Java 堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)。 根据 Java 虚拟机规范的规定, Java 堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像磁盘空间一样。 在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的(通过 –Xmx 和 –Xms 控制)。 如果在堆中没有完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。 二、方法区 方法区(Method Area)与 Java 堆一样,是各个线程共享的内存 区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

JVM配置参数理解

时光总嘲笑我的痴心妄想 提交于 2019-12-03 20:39:24
基本参数 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize=128M JVM最大允许分配的非堆内存,按需分配 堆(Heap)    在jvm启动时,会创建一个堆,,所有类实例和数组的内存均从此处分配,,堆,,使用jvm分配给开发者使用的内存, JVM初始分配的堆内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的堆内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制; 空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx 相等以避免在每次GC 后调整堆的大小。 说明:如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemory错误,此错误来自JVM,不是Throwable的,无法用try...catch捕捉。 非堆(Non-heap)内存   jvm 自己使用的内存大小 所有方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中 JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64

java -Xms -Xmx设置java应用程序运行的内存大小,Xms Xmx PermSize MaxPermSize 区别

时光总嘲笑我的痴心妄想 提交于 2019-12-03 16:07:30
java -Xms -Xmx 设置java 应用程序运行的内存大小,Xms Xmx PermSize MaxPermSize 区别 版权声明:本文为博主原创文章,未经博主允许不得转载。 -Xms 和 -Xmx 是 Java 命令的一个选项,用来设置你的应用程序启动时的可用内存大小和运行时的可用的内存大小。 Xmx 是 java 的一个选项,用来设置你的应用程序能够使用的最大内存数(看好,只是你的应用程序,不是整个 jvm ) , 如果你的程序要花很大内存的话,那就需要修改缺省的设置,比如配置 tomcat 的时候,如果流量啊程序啊都很大的话就需要加大这个值了,不过有一点是要记住的,不要大得超过你的机器的内存,那样你的机器会受不了的,到时候就死翘翘了。 Xms 是另一个设置内存的参数 , 用它来设置程序初始化的时候内存栈的大小,增加这个值的话你的程序的启动性能会得到提高。不过同样有前面的限制,以及受到 Xmx 的限制。 不同的虚拟机的实现虽然千差万别,但是他们的运行模式都是一样的,只是性能有所不同罢了。 虚拟机只是一个软件实现,它是一个在内存中的机器,而我们机器上装的是 jre ,是为了生成这个 jvm 用的。通常来说,每次运行一个 application 都会生成一个 jvm ,但是也可以有多个程序在同一个 jvm 里面。 Eclipse 崩溃,错误提示: MyEclipse

eclipse.ini、flashbuilder.ini内存设置和堆栈非堆栈问题

一个人想着一个人 提交于 2019-12-03 16:07:05
eclipse.ini内存设置 ,flashbuilder.ini类似: -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 这里有几个问题: 1. 各个参数的含义什么? 2. 为什么有的机器我将-Xmx和-XX:MaxPermSize都设置为512M之后Eclipse可以启动,而有些机器无法启动? 3. 为何将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置? 下面我们一一进行回答 1. 各个参数的含义什么? 参数中-vmargs的意思是设置JVM参数,所以后面的其实都是JVM的参数了,我们首先了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 堆(Heap)和非堆(Non-heap)内存 按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据

Java堆空间Vs栈内存

 ̄綄美尐妖づ 提交于 2019-12-03 10:24:19
之前我写了几篇有关Java垃圾收集的文章之后,我收到了很多电子邮件,请求解释 Java堆空间 , Java栈内存 , Java中的内存分配 以及它们之间的区别。 您可能在Java,Java EE书籍和教程中看到很多有关堆和变量内存的参考,但是几乎没有就程序而言完全解释堆和栈的内存分配的。 Java堆空间 Java运行时使用Java堆空间为对象和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。 垃圾回收在堆内存上运行以释放没有任何引用的对象使用的内存。在堆空间中创建的任何对象都具有访问权限,并且可以从应用程序的任何位置进行引用。 Java栈内存 Java Stack内存用于执行线程。它们包含短期的方法特定值,以及从该方法引用的对堆中其他对象的引用。 每当调用方法时,都会在磁盘存储中创建一个新块,以容纳该方法的本地原始值并引用该方法中的其他对象。 方法结束后,该块将立即立即变为未使用状态,用作下一个方法使用。 与堆内存分配,栈内存的大小要小一点。 Java程序中的堆空间和栈内存分配 让我们用一个简单的程序来了解堆和交替的内存使用情况。 package com.journaldev.test; public class Memory { public static void main(String[] args) { // Line 1 int i=1; // Line

JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

安稳与你 提交于 2019-12-03 02:55:58
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助。 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身 栈区: 1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中 2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。 3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。 方法区: 1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。 2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。 为了更清楚地搞明白发生在运行时数据区里的黑幕,我们来准备2个小道具(2个非常简单的小程序)。 AppMain.java public class AppMain //运行时, jvm 把appmain的信息都放入方法区 { public static void main

解Bug之路:记一次JVM堆外内存泄露Bug的查找

匿名 (未验证) 提交于 2019-12-03 00:19:01
行业前列 百家号 01-15 16:30 前言 JVM的堆外内存泄露的定位一直是个比较棘手的问题。此次的Bug查找从堆内内存的泄露反推出堆外内存,同时对物理内存的使用做了定量的分析,从而实锤了Bug的源头。 由于物理内存定量分析部分用到了linux kernel虚拟内存管理的知识,读者如果有兴趣了解请看ulk3(《深入理解linux内核第三版》) 内存泄露Bug现场 一个线上稳定运行了三年的系统,从物理机迁移到docker环境后,运行了一段时间,突然被监控系统发出了某些实例不可用的报警。所幸有负载均衡,可以自动下掉节点,如下图所示: 登录到对应机器上后,发现由于内存占用太大,触发OOM,然后被linux系统本身给kill了。 应急措施 紧急在出问题的实例上再次启动应用,启动后,内存占用正常,一切Okay。 奇怪现象 当前设置的最大堆内存是1792M,如下所示: -Xmx1792m -Xms1792m -Xmn900m -XX:PermSize=256m -XX:MaxPermSize=256m -server -Xss512k 查看操作系统层面的监控,发现内存占用情况如下图所示: 上图蓝色的线表示总的内存使用量,发现一直涨到了4G后,超出了系统限制。 很明显,有堆外内存泄露了。 查找线索 gc日志 一般出现内存泄露,笔者立马想到的就是查看当时的gc日志。

c++中关于堆和堆栈的区别

匿名 (未验证) 提交于 2019-12-03 00:15:02
转载https://www.cnblogs.com/sea-stream/p/11361476.html new&delete和malloc&free的联系与区别 new和malloc都是申请内存空间,分配的空间都在堆存储区。 new的时候会初始化内存空间,而malloc只是申请了内存空间,不进行初始化;同时,delete会调用析构函数,而free只是释放内存空间,指针还在(因此free之后,还需要设置指针为NULL)。 malloc&free是C/C++的标准库函数,而new&delete是C++的运算符。 来源:博客园 作者: 乐呵的太阳 链接:https://www.cnblogs.com/happytaiyang/p/11764069.html

转:Tomcat 内存溢出 \"OutOfMemoryError\" 问题总结 (JVM参数说明)

匿名 (未验证) 提交于 2019-12-03 00:12:02
问题说明: 公司内网环境中部署的jenkins代码发版平台突然不能访问了,查看tomcat的catalina.out日志发现报错如下: ? 1 2 3 4 5 6 [root@redmine logs] # tail -f /srv/apache-tomcat-7.0.67/logs/catalina.out ...... Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space Exception in thread "http-bio-8080-exec-5" java.lang.OutOfMemoryError: PermGen space ...... 上面报错是由于tomcat内存溢出引起的: ? 1 2 3 [root@redmine logs] # ps -ef|grep tomcat /usr/java/jdk1 .7.0_79 /bin/java -Djava.util.logging.config. file = /srv/apache-tomcat-7 .0.67 /conf