JVM

JVM-08丨对象进入老年代的四种方式

Posted by jiefang on October 28, 2019
  • 1、大对象直接进入老年代

    比如很长的字符串,或者很大的数组等,参数-XX:PretenureSizeThreshold=3145728设置,超过这个参数设置的值就直接进入老年代

  • 2、长期存活的对象进入老年代

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

  • 3、动态对象年龄判定

    按照年龄从小到大对其所占用的大小进行累积,当累积的某个年龄大小超过了survivor区的一半时,取这个年龄和MaxTenuringThreshold中更小的一个值,作为新的晋升年龄阈值。当 Survivor 空间中相同年龄所有对象的大小总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,而不需要达到默认的分代年龄。比如Survivor区内年龄1+年龄2+年龄3+年龄n对象总和大于Survivor区的50%,年龄n及以上的对象会进入老年代。

  • 4、Young GC后存活对象太多不足以放入Survivor区

    如果一次Young GC后存活对象太多不足以放入Survivor区,此时直接放入老年代。