java晋升(进入老年代)的四种方法
- 担保机制
- 大对象直接进入老年代
- 长期存活的对象
- 动态年龄判断
1. 担保机制
什么是担保机制?
就是你的新生代内存不足的时候,通过担保分配的方式让大对象直接分配到老年代;
谁来担保?当然是老年代,为什么叫“担保”?就像贷款需要担保一样,年轻代存放不下的时候(自己信用不够的时候),需要让老年代来存放(需要相应的担保人来进行担保),老年代就是这个担保人,担保人需要保证老年代一定能存放的下;
2.大对象直接进入老年代
通过参数-XX:PretenureSizeThreshold来定义大对象,单位byte,默认为0;
这个参数的默认值为0,也就是说,所有的对象创建出来之后默认都是分配到新生代的,当我们指定了大小之后,只要创建出来的对象超过设定值,那么这个对像就会直接晋升到老年代;
需要注意的是:PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效;
3.长期存活的对象
长期存活的对象进入老年代。在堆中分配内存的对象,其内存布局的Header中包含了 GC 分代年龄标记信息。如果对象在 eden 区出生,那么它的 GC 分代年龄会初始值为 1,每熬过一次 Minor GC 而不被回收,这个值就会增加 1 岁。当它的年龄到达一定的数值时(默认是 15 岁),就会晋升到老年代中。
4.动态年龄判断
当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要达到默认的分代年龄。