2024-10-26
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://www.skjava.com/mianshi/baodian/detail/1672036434

回答

一、对象年龄

JVM 给每个都定义了一个对象年龄计数器。首先对象在新生代的 Eden 去分配,经历第一次 Minor GC 后仍然存活,并且能够被 Survivor 容纳的话,则它将被移动到 Survivor 区,同时对象的年龄设置为 1。对象在 Survivor 取每经历一次 Minor GC 仍然能够存活的话,年龄就增加 1,当它的年龄增加到一定程度(默认为 15)时,就晋升到老年代。

对象晋升老年代的年龄阈值可以通过 -XX:MaxTenuringThreshold=<N> 配置,但最大只能到 15。

二、Survivor 区的占用情况

如果新生代经历一个 Minor GC 后,Survivor 区放不下所有幸存的对象,则一部分对象会直接晋升到老年代。

三、动态年龄判定

为了能更好的适应不同程序的内存状况,JVM 并不总是要求对象的年龄达到指定的阈值才会进入老年代,它会动态调整年龄阈值,提前晋升一些对象。即若在 Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,则年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到 MaxTenuringThreshold 中要求的年龄。

阅读全文