JVM1.7和1.8内存对比(转载)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值