Java中对象一般在新生代中进行创建,但是在一定的机制中会触发晋升老年代的机制。相关机制包括:
1、分配担保机制
Eden区满时,进行Minor GC,当Eden和一个Survivor区中依然存活的对象无法放入到Survivor中,则通过分配担保机制提前转移到老年代中。
2、对象过大
若对象体积太大,新生代无法容纳这个对象,就会绕过新生代, 直接在老年代分配, 此参数只对Serial及ParNew两款收集器有效。
参数-XX:PretenureSizeThreshold用来设置这个门限值。
3、长期存活的对象
对象头的Mark Word中包含对象的年龄。当年龄增加到一定的临界值时,就会晋升到老年代中。
该临界值由参数:-XX:MaxTenuringThreshold来设置,默认为15,即对象在经历15次minor gc后会晋升到老年代。
4、动态对象年龄判定
如果在Survivor区中相同年龄的对象的所有大小之和超过Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。