OracleJDK/Hotspot 9 G1GC日志标记:如何分析各阶段耗时
嘿,刚好熟悉这块!JDK 9 开始 HotSpot 引入了统一日志框架,彻底替换了 JDK 8 及以前一堆零散的 -XX:+PrintXXX 参数。不过不用担心,我们可以通过新的 -Xlog 参数组合,轻松拿到和旧版本一样(甚至更详细)的 Young GC 各阶段耗时信息。
核心配置思路
JDK 9+ 用 -Xlog 统一管理日志,你需要指定日志标签、日志级别、输出位置和附加字段。针对你的需求,重点关注以下标签:
gc:基础 GC 事件日志gc+phases:GC 各阶段的详细耗时(对应你要的G1Ergonom...这类阶段信息)gc+ergo:G1 自适应调整策略日志(对应旧版的PrintAdaptiveSizePolicy)gc+age:对象晋升年龄分布(对应旧版的PrintTenuringDistribution)gc+application:应用并发/暂停时间(对应旧版的PrintGCApplicationConcurrentTime和PrintGCApplicationStoppedTime)
完整配置示例
直接用这个配置就能覆盖你旧版所有需求:
-Xlog:gc,gc+phases,gc+ergo,gc+age,gc+application=info:file=gc.log:time,uptime,level,tags
参数解释:
- 日志标签与级别:
gc,gc+phases,...=info表示开启这些标签的info级别日志,足够获取阶段耗时和核心细节;如果需要更细粒度的调试信息,可以把级别改成debug。 - 输出位置:
file=gc.log指定日志输出到文件,你也可以改成stdout直接打印到控制台。 - 附加字段:
time,uptime,level,tags会输出日志的日期时间、JVM 启动时长、日志级别和标签,对应旧版的PrintGCDateStamps、PrintGCTimeStamps等功能。
额外说明
- JDK 9 开始 G1GC 已经是默认垃圾收集器,所以
-XX:+UseG1GC可以不用显式指定,当然加上也没问题。 - 旧版的
-XX:+UnlockCommercialFeatures和-XX:+UnlockExperimentalVMOptions在 JDK 9 里已经不再需要,G1 的所有特性都默认开放了。 - 如果想单独查看 Young GC 的阶段耗时,可以把标签细化为
gc+phases+young=info,过滤掉其他 GC 类型的日志。
日志示例片段
配置生效后,你会看到类似这样的 Young GC 阶段耗时日志:
[2024-05-20T14:35:22.456+0800][info][gc,phases] GC(45) Pause Young (Normal) (G1 Evacuation Pause) 120M->65M(512M) 28.7ms
[2024-05-20T14:35:22.456+0800][info][gc,phases] GC(45) Phase 1: Mark live objects 6.2ms
[2024-05-20T14:35:22.456+0800][info][gc,phases] GC(45) Phase 2: Prepare evacuation 1.1ms
[2024-05-20T14:35:22.456+0800][info][gc,phases] GC(45) Phase 3: Evacuate objects 18.3ms
[2024-05-20T14:35:22.456+0800][info][gc,phases] GC(45) Phase 4: Update references 3.1ms
内容的提问来源于stack exchange,提问作者Michael P

