可通过jvm参数开启gc日志并精准记录停顿时间:jdk 8及以前用-xx:+printgcdetails等旧参数,jdk 9+统一用-xlog,并配合日志滚动、安全点统计等提升精度。

可以通过 JVM 启动参数开启 GC 日志并输出详细的停顿时间信息,关键在于选择合适的日志参数组合,并注意不同 JDK 版本的语法差异。
JDK 8 及以前:使用 -XX:+PrintGCDetails 和 -XX:+PrintGCDateStamps
这是最常用的一组参数,能打印每次 GC 的类型、前后堆内存占用、耗时及时间戳:
- -XX:+PrintGCDetails:输出详细 GC 信息(如年轻代/老年代回收前后的大小、是否发生 Full GC、晋升对象大小等)
- -XX:+PrintGCDateStamps:以日期时间格式(如 2024-05-12T14:23:18.123+0800)标记每条日志,便于关联业务时间点
- -Xloggc:/path/to/gc.log:指定日志输出文件路径(不加此参数默认输出到 stdout)
- 可选加 -XX:+PrintGCTimeStamps:用相对 JVM 启动秒数打时间戳(如 123.456),适合分析间隔和频率
JDK 9+(含 11/17/21):统一使用 -Xlog 参数
JDK 9 起废弃了旧参数,改用更灵活的 -Xlog,推荐写法如下:
- -Xlog:gc*:file=/path/to/gc.log:time,tags,level:基础详细模式,包含时间戳、GC 标签(如 gc,gc+heap)、日志级别
-
-Xlog:gc+pause=debug:file=/path/to/gc.log:time:专门聚焦“停顿”事件,精准输出 STW(Stop-The-World)时长,例如:
[2024-05-12T14:23:18.123+0800][debug][gc,pause] GC(12) Pause Young (Normal) (G1 Evacuation Pause) 123.456ms - 如需同时看内存变化,可叠加:
-Xlog:gc*,gc+heap=debug:file=/path/to/gc.log:time,tags
必须配合的参数:确保停顿时间被准确记录
仅开启日志还不够,部分 GC 停顿可能被优化或合并。以下参数能提升精度:
- -XX:+UseGCLogFileRotation + -XX:NumberOfGCLogFiles=5 + -XX:GCLogFileSize=10M:启用日志滚动,避免单文件过大丢失早期数据
- -XX:+PrintSafepointStatistics + -XX:PrintSafepointStatisticsCount=1:辅助排查非 GC 引起的 STW(如 JIT 编译、类加载),常被忽略但很关键
- G1 用户建议加 -Xlog:gc+ergo*=trace:查看 G1 自适应调优决策过程,帮助理解停顿波动原因
验证与快速定位停顿峰值
生成日志后,可用简单命令快速提取关键信息:










