JVM 调整进入老年代的年龄

——长期存活对象进入老年代

虚拟机采用分代收集的思想来管理内存,内存回收时必须识别哪些对象放入新生代,哪些对象放入老年代。为了做到这点,虚拟机为每个对象定义了一个对象年龄计数器。

如果对象在Eden出生并经过一次Minor GC仍然存活,并且能被Survivor容纳,将被移动到Survivor区,并且对象年龄设置为1.对象每经过一次Minor GC后仍保持存活,年龄+1

当对象年龄到达一定程度(一般15岁),那么它会晋升到老年代。对象晋升的年龄限制 -XX:MaxTenuringThreshold设定

为了更好的适应不同程度的内存状况,虚拟机并不是永远地要求对象的年龄必须到达MaxTenuringThreshold才能晋升进入老年代,当Survivor中相同年龄所有对象大小总和大于Survivor空间一半,年龄大于该年龄的对象直接进入老年代。

——空间分配担保

在发生Minor GC之前,虚拟机会检查老年代最大可用的连续空间是否大于新生代所有空间总和,如果条件程离,那么Minor GC是安全的,如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小,如果大于则进行Minor GC 否则可能进行一次Full GC

新生代使用复制收集算法,但为了内存利用率,只使用其中一个Survivor空间作为轮换备份,因此当出现大量对象在Minor GC仍然存活的情况(最极端情况为内存回收后新生代所有对象都存活),就需要老年代进行担保,把Survivor无法容纳的对象存入老年代。但老年代需要足够空间,所以需要进行判断,当不足时 进行Full GC腾出老年代空间
--------------------- 
作者:一只老风铃 
来源:CSDN 
原文:https://blog.csdn.net/qq_33369979/article/details/87893273 
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值