java对象晋升的四种情况

java晋升(进入老年代)的四种方法

  1.   担保机制
  2.   大对象直接进入老年代
  3.   长期存活的对象
  4.   动态年龄判断

1. 担保机制

  什么是担保机制?

  就是你的新生代内存不足的时候,通过担保分配的方式让大对象直接分配到老年代;

  谁来担保?当然是老年代,为什么叫“担保”?就像贷款需要担保一样,年轻代存放不下的时候(自己信用不够的时候),需要让老年代来存放(需要相应的担保人来进行担保),老年代就是这个担保人,担保人需要保证老年代一定能存放的下

2.大对象直接进入老年代

  通过参数-XX:PretenureSizeThreshold来定义大对象,单位byte,默认为0;

  这个参数的默认值为0,也就是说,所有的对象创建出来之后默认都是分配到新生代的,当我们指定了大小之后,只要创建出来的对象超过设定值,那么这个对像就会直接晋升到老年代;

  需要注意的是:PretenureSizeThreshold参数只对Serial和ParNew两款收集器有效;

3.长期存活的对象

  长期存活的对象进入老年代。在堆中分配内存的对象,其内存布局的Header中包含了 GC 分代年龄标记信息。如果对象在 eden 区出生,那么它的 GC 分代年龄会初始值为 1,每熬过一次 Minor GC 而不被回收,这个值就会增加 1 岁。当它的年龄到达一定的数值时(默认是 15 岁),就会晋升到老年代中。

4.动态年龄判断

  当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要达到默认的分代年龄。

 

参考链接:

  https://blog.csdn.net/qq_27184497/article/details/117828331

 

posted @ 2022-05-03 23:49  FOEVERYANG  阅读(307)  评论(0编辑  收藏  举报