描述对象何时会从新生代晋升到老年代。

存活对象会在以下情况下进入老年代:

  1. 年龄达到阈值:在新生代中,每个对象都有一个年龄计数器。当对象在Survivor区中经历一次Minor GC后,其年龄就会增加1。当对象的年龄达到一定的阈值(默认值是15,可通过-XX:MaxTenuringThreshold参数设置),就会被晋升到老年代。这个阈值可以通过虚拟机参数-XX:MaxTenuringThreshold来设定。

  2. Survivor空间不足:在进行Minor GC时,如果Survivor空间不足以容纳Eden区和Survivor区中所有存活的对象,那么大于等于某个年龄的对象会直接被移动到老年代,这个年龄阈值会动态调整,以使得Survivor区能够容纳下其他存活对象。

  3. 动态对象年龄判定:如果Survivor区中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于等于该年龄的对象就可以直接进入老年代,无须等到-XX:MaxTenuringThreshold设定的年龄。

  4. 大对象直接进入老年代:大对象是指需要大量连续内存空间的Java对象,如很长的字符串或者数组。大对象会直接被分配到老年代,这是因为对大对象进行复制回收,存活率高的情况下,会产生大量的内存复制操作,效率相对较低。

这些策略的目的是尽可能将生命周期长的对象提前移入老年代,减少新生代的GC次数,提高系统的运行效率。

发表评论

后才能评论