启用-xx:+printtenuringdistribution可打印对象晋升老年代过程信息,它在每次minor gc后输出survivor区对象年龄分布、当前晋升阈值等关键数据,配合-xx:+printgcdetails等参数可完整追踪晋升行为。

要打印对象晋升老年代的过程信息,关键在于启用 JVM 的分代行为追踪参数,特别是与对象年龄、晋升阈值和 GC 期间对象分布相关的日志选项。
启用对象晋升详情日志
使用 -XX:+PrintTenuringDistribution 是最直接的方式。它会在每次 Minor GC 后输出 Survivor 区中对象的年龄分布,包括各年龄段对象大小、目标晋升年龄、当前晋升阈值等,从而清晰反映对象“熬过几次 GC 后准备晋升”或“已晋升到老年代”的过程。
例如输出片段:
Desired survivor size 524288 bytes, new threshold 1 (max 15) - age 1: 123456 bytes, 123456 total - age 2: 45678 bytes, 169134 total
其中 new threshold 1 表示本次 GC 后,年龄 ≥1 的对象将被晋升(因 Survivor 空间不足或达到阈值),这就是晋升决策的实时体现。
配合其他参数增强可读性
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
-XX:+PrintGCDetails:提供 GC 类型、耗时、各代内存变化等上下文; -
-XX:+PrintGCDateStamps或-XX:+PrintGCTimeStamps:标记每次 GC 的发生时间,便于关联分析; -
-Xloggc:gc.log:将上述所有日志统一输出到指定文件,避免混在控制台中丢失; -
-XX:+UseParallelGC或-XX:+UseG1GC:不同 GC 器对晋升策略实现不同,建议明确指定以便预期行为一致(G1 中还可用-XX:+PrintAdaptiveSizePolicy查看动态调整逻辑)。
验证晋升阈值设置(可选)
若需确认 JVM 实际采用的晋升年龄上限,可用:
java -XX:+PrintFlagsFinal -version | grep MaxTenuringThreshold
默认值为 15,但实际生效阈值由 -XX:+PrintTenuringDistribution 输出中的 new threshold 动态决定——它可能低于设定值(如 Survivor 满了就提前晋升)。
注意点
-
PrintTenuringDistribution只在发生 Minor GC 时输出,Full GC 不触发该行; - 它不记录“哪个具体对象晋升”,而是统计维度的分布数据,适合容量与策略分析;
- 若未看到输出,请确认是否启用了
-XX:+PrintGCDetails(部分 JDK 版本下二者需共用才生效)。
这样配置后,你就能持续观察对象在年轻代中存活轮次、Survivor 容量压力及实际晋升节奏,为调优 -XX:MaxTenuringThreshold、-XX:SurvivorRatio 或堆结构提供依据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










