原文出处: xstarcd
堆和非堆内存
凭据官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均以后处分派。堆是在 Java 虚拟机启动时建设的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
JVM主要打点两种范例的内存:堆和非堆。
Heap memory Code Cache
Eden Space
Survivor Space
Tenured Gen
non-heap memory Perm Gen
native heap?(I guess)
堆内存
Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均以后处分派。堆是在 Java 虚拟机启动时建设的。工具的堆内存由称为垃圾接纳器的自动内存打点系统接纳。
堆的巨细可以牢靠,也可以扩大和缩小。堆的内存不需要是持续空间。
非堆内存
Java 虚拟机打点堆之外的内存(称为非堆内存)。
Java 虚拟机具有一个由所有线程共享的要领区。要领区属于非堆内存。它存储每个类布局,如运行时常数池、字段和要领数据,以及要领和结构要领的代码。它是在 Java 虚拟机启动时建设的。
要领区在逻辑上属于堆,但 Java 虚拟机实现可以选择差池其举办接纳或压缩。与堆雷同,要领区的巨细可以牢靠,也可以扩大和缩小。要领区的内存不需要是持续空间。
除了要领区外,Java 虚拟机实现大概需要用于内部处理惩罚或优化的内存,这种内存也长短堆内存。譬喻,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而得到高机能。
几个根基观念
PermGen space:全称是Permanent Generation space,即永久代。就是说是永久生存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域,GC(Garbage Collection)应该不会对PermGen space举办清理,所以假如你的APP会LOAD许多CLASS的话,昆山软件公司,就很大概呈现PermGen space错误。
Heap space:存放Instance。
Java Heap分为3个区,Young即新生代,Old即老生代和Permanent。
Young生存刚实例化的工具。当该区被填满时,GC会将工具移到Old区。Permanent区则认真生存反射工具。
堆内存分派
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捕获。
非堆内存分派
JVM利用-XX:PermSize配置非堆内存初始值,默认是物理内存的1/64;
由XX:MaxPermSize配置最大非堆内存的巨细,默认是物理内存的1/4。
- 尚有一说:MaxPermSize缺省值和-server -client选项相关,-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32m。这个我没有尝试。
XX:MaxPermSize配置过小会导致java.lang.OutOfMemoryError: PermGen space 就是内存益出。
为什么会内存益出:
- 这一部门内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域差异。
- GC(Garbage Collection)不会在主措施运行期对PermGen space举办清理,所以假如你的APP会LOAD许多CLASS 的话,就很大概呈现PermGen space错误。
这种错误常见在web处事器对JSP举办pre compile的时候。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操纵系统有很大的干系。简朴的说就32位处理惩罚器固然可控内存空间有4GB,可是详细的操纵系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理惩罚器就不会有限制了。
为什么有的呆板我将-Xmx和-XX:MaxPermSize都配置为512M之后Eclipse可以启动,而有些呆板无法启动?
通过上面临JVM内存打点的先容我们已经相识到JVM内存包括两种:堆内存和非堆内存,别的JVM最大内存首先取决于实际的物理内存和操纵系统。所以说配置VM参数导致措施无法启动主要有以下几种原因:
- 参数中-Xms的值大于-Xmx,可能-XX:PermSize的值大于-XX:MaxPermSize;
- -Xmx的值和-XX:MaxPermSize的总和高出了JVM内存的最大限制,好比当前操纵系统最大内存限制,可能实际的物理内存等等。说到实际物理内存这里需要说明一点的是,假如你的内存是1024MB,但实际系统顶用到的并不行能是1024MB,昆山软件开发,因为有一部门被硬件占用了。
假如你有一个双核的CPU,也许可以实验这个参数: -XX:+UseParallelGC 让GC可以更快的执行。(只是JDK 5里对GC新增加的参数)
假如你的WEB APP下都用了大量的第三方jar,其巨细高出了处事器jvm默认的巨细,那么就会发生内存益出问题了。办理要领: 配置MaxPermSize巨细。
- 增加处事器启动的JVM参数配置: -Xms128m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
- 如tomcat,修改TOMCAT_HOME/bin/catalina.sh,在echo “Using CATALINA_BASE: $CATALINA_BASE”上面插手以下行:JAVA_OPTS=”-server -XX:PermSize=64M -XX:MaxPermSize=128m
发起:将沟通的第三方jar文件移置到tomcat/shared/lib目次下,这样可以淘汰jar 文档反复占用内存