jdk1.7的堆内存模型:
1.Young (新生代)
新生代 分为三部分。Eden区(new 的对象)和两个大小相同的Survivior区(某一时刻,只有一个被使用),另外一个,当Eden区满了,GC就会将存活的对象移动到空闲的Survivor区,根据JVM的策略,在经过几次垃圾收集后,依然存活在Survivor区的对象,将移动到Tenured区(老年代)
2.Tenured(老年代)
老年代 主要保存生命周期长的对象。(new 的大对象,会直接进入老年代)
3.Perm(永久代)
永久代主要保存class、method、filed对象。这部分的空间一般不会溢出,除非一次性加载很多的类,不过在涉及热部署的应用服务器的时候,有时候会遇到 java.lang.OutOfMemoryError: PermGen space的错误
jdk1.8的堆内存模型:
上图表明,jdk1.8的内存模型有2部分:年轻代+老年代
年轻代:Eden + 2*Survivor (Survivor from + Survivor to)
老年代: OldGen
在jdk1.8中变化最大是 Perm(永久区),用 Metaspace(元数据空间)进行替换
注:Metaspace所占用的内存空间不是虚拟机内部的,而是本地内存空间。
为什么要废除1.7的永久区?
1.在jdk1.8之前的HotSpot实现中,类的元数据 如 方法数据、方法信息(字节码、栈和变量的大小)、运行时常量池等被保存在永久代,32位默认永久代大小为64M,64位默认85M,可以通过参数 -XX:MaxPermSize进行设置,一旦类的元数据超过了永久代的大小,就会抛出OOM(内存过大,虚拟机死掉了)异常。
2.对永久代的调优过程非常困难,永久代的大小很难确定,其中涉及到太多因素,如类的总数,常量池大小和方法数量等,而且永久代的数据可能会随着每一次Full GC而发生移动。
3.而在jdk1.8中,类的元数据保存在本地内存中,元空间的最大可分配空间就是系统可用内存空间。
4.官网给的解释:为了融合HotSpot JVM 与 JRockit VM ,因为JRockit VM没有永久代,不需要配置永久代
————————————————
版权声明:本文为CSDN博主「喜欢撸猫的男孩」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011625421/article/details/87879775