如何利用 JVM 参数 -XX:MaxTenuringThreshold 动态调整长生命周期对象的存活阈值?
- 内容介绍
- 相关推荐
本文共计848个文字,预计阅读时间需要4分钟。
MaxTenuringThreshold 无法动态调整——它是一个 启动时静态参数。JVM 进程一旦启动,该值就固定不变,无法通过 jcmd、jinfo -flag 或 JMX 在运行时修改(尝试修改会报错 Not manageable)。
所以,“动态调整”在这里实际指的是:基于应用对象行为特征,在启动前合理预设该阈值,使其精准匹配长生命周期对象的典型存活周期,从而避免过早或过晚晋升。
下面从三个关键角度说明如何做好这个“预设”:
如何识别长生命周期对象的真实存活次数
不是靠猜测,而是靠 GC 日志实证:
- 启用详细 GC 日志:
-Xlog:gc+age=trace:file=gc-age.log -XX:+PrintGCDetails
- 关注日志中类似这一行:
Desired survivor size 1048576 bytes, new threshold 10 (max 15) - age 1: 123456 bytes, 123456 total - age 2: 98765 bytes, 222221 total ... - age 10: 2100 bytes, 998765 total
若发现大量对象在 age=7~9 就已稳定存活、且后续年龄增长缓慢,说明它们大概率会活过 10 次 Minor GC —— 那么
MaxTenuringThreshold设为 10 或 12 更贴合实际,而非默认 15。
本文共计848个文字,预计阅读时间需要4分钟。
MaxTenuringThreshold 无法动态调整——它是一个 启动时静态参数。JVM 进程一旦启动,该值就固定不变,无法通过 jcmd、jinfo -flag 或 JMX 在运行时修改(尝试修改会报错 Not manageable)。
所以,“动态调整”在这里实际指的是:基于应用对象行为特征,在启动前合理预设该阈值,使其精准匹配长生命周期对象的典型存活周期,从而避免过早或过晚晋升。
下面从三个关键角度说明如何做好这个“预设”:
如何识别长生命周期对象的真实存活次数
不是靠猜测,而是靠 GC 日志实证:
- 启用详细 GC 日志:
-Xlog:gc+age=trace:file=gc-age.log -XX:+PrintGCDetails
- 关注日志中类似这一行:
Desired survivor size 1048576 bytes, new threshold 10 (max 15) - age 1: 123456 bytes, 123456 total - age 2: 98765 bytes, 222221 total ... - age 10: 2100 bytes, 998765 total
若发现大量对象在 age=7~9 就已稳定存活、且后续年龄增长缓慢,说明它们大概率会活过 10 次 Minor GC —— 那么
MaxTenuringThreshold设为 10 或 12 更贴合实际,而非默认 15。

