深入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腾出老年代空间

猜你喜欢

转载自blog.csdn.net/qq_33369979/article/details/87893273
今日推荐