文章导读
大家好,我是顺亿,今天我们来聊聊JVM中对象晋升老年代的条件以及触发Full GC的情况。这些知识点对于理解JVM的内存管理和垃圾回收机制非常重要。读完这篇文章,你将能清晰地了解对象晋升老年代的具体规则,以及Full GC触发的原因。
1. 躲过15次GC之后进入老年代
系统启动时创建的对象默认分配在年轻代。随着系统运行,年轻代空间不足时,会触发Minor GC。如果某个对象在年轻代中存活时间较长,每次都能躲过GC,它的年龄就会逐渐增加。当年龄达到15岁时,也就是躲过15次GC后,这个对象就会被转移到老年代。
具体年龄阈值可以通过JVM参数“-XX:MaxTenuringThreshold”来设置,默认值为15。
2. 动态对象年龄判断
除了静态规则外,还有一种动态规则可以让对象提前进入老年代。如果Survivor区域中一批对象的总大小超过了Survivor区域内存大小的50%,那么这批对象中年龄大于等于该年龄的对象可以直接进入老年代。
3. 大对象直接进入老年代
可以通过设置JVM参数“-XX:PretenureSizeThreshold”来指定一个阈值,例如1MB。大于这个阈值的对象会直接进入老年代,避免在年轻代中反复GC。
4. Minor GC后的对象太多,无法放入Survivor区
如果Minor GC后存活对象太多,无法放入Survivor区,这些对象会被直接转移到老年代。
5. 老年代空间分配担保规则
如果年轻代对象需要转移到老年代,但老年代空间不足,JVM会进行一系列检查,以决定是否触发Full GC。如果老年代可用内存大于年轻代所有对象的总大小,可以放心进行Minor GC。如果老年代空间不足,且没有设置“-XX:-HandlePromotionFailure”参数,会直接触发Full GC。
Full GC会回收老年代和年轻代的对象,如果Full GC后老年代仍然不足,可能导致OOM错误。
小结与拓展
本文介绍了JVM对象晋升老年代的规则以及触发Full GC的情况。了解这些机制有助于我们进行JVM优化,提高系统性能。更多JVM优化技巧和知识,请关注「趣航编程网」(www.vqhf.com)。
—— 顺亿,资深全栈工程师,趣航编程网资深编辑
