jdk 11+ 必须用 -xlog:gc*:file=gc.log:time,uptime,pid,tags 开启 gc 日志,旧参数如 -xx:+printgcdetails 已废弃;需关注标签组合、滚动策略及 gceasy 等工具辅助分析。

Java 垃圾回收(GC)日志是排查内存问题、优化 JVM 性能的重要依据。正确配置 GC 日志参数,才能获取完整、可读、结构化的日志内容;而有效分析日志,则需理解关键字段含义与典型模式。
启用详细 GC 日志的常用参数组合
不同 JDK 版本参数差异较大,需按版本选择:
- JDK 8 及之前:使用 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M
- JDK 9–10:转向统一 JVM 日志框架,推荐 -Xlog:gc*:file=/path/to/gc.log:time,tags,level:filecount=5,filesize=10M
- JDK 11+(含 LTS 版本):延续 JEP 264 的日志格式,更清晰支持多维度过滤,例如 -Xlog:gc*,gc+heap=debug,gc+ref=debug:file=/path/to/gc.log:time,uptime,pid,tags:filecount=5,filesize=10M
注意:避免混用新旧参数(如在 JDK 11 中仍用 -XX:+PrintGCDetails),会导致参数被忽略或启动失败。
识别日志中的关键信息字段
以 JDK 11 的典型 GC 日志片段为例:
[2024-03-15T10:22:34.123+0800][789ms][info][gc] GC(3) Pause Young (Allocation Failure) 2048M->512M(4096M) 42.123ms- 时间戳与 uptime:[2024-03-15T10:22:34.123+0800][789ms] 分别表示绝对时间和 JVM 启动后毫秒数,便于关联其他系统日志
- GC 编号与类型:GC(3) 是本次 GC 的递增序号;Pause Young (Allocation Failure) 表明这是一次年轻代 GC,触发原因是对象分配失败
- 内存变化:2048M->512M(4096M) 表示 GC 前堆使用 2048MB,GC 后剩 512MB,总堆容量 4096MB;若出现 2048M->2040M 则说明回收效果差,需警惕内存泄漏或晋升过快
- 耗时:42.123ms 是 STW(Stop-The-World)暂停时间,YGC 通常应 200ms 需重点关注
常见异常模式与初步判断方向
分析日志时不必逐行细读,先扫描高频信号:
- 频繁 YGC(每秒多次):可能年轻代过小、对象存活时间长、或存在短生命周期大对象(如 byte[] 缓冲区),可结合 -Xmn 和对象分配采样进一步验证
- YGC 后老年代持续增长:说明大量对象提前晋升,检查是否设置了过小的 -XX:MaxTenuringThreshold 或 Survivor 区太小(-XX:SurvivorRatio)
- Full GC 频繁发生:JDK 8 中常见于 CMS 失败后退化为 Serial Old;JDK 11+ 使用 G1/ZGC 时出现 Full GC 通常意味着配置不合理(如 G1HeapRegionSize 过大)或元空间/本地内存泄漏
- GC 日志中出现 “Allocation Failure” 外的触发原因:如 “Metadata GC Threshold” 表示 Metaspace 达限,“System.gc()” 表明代码中显式调用了 GC(应避免)
辅助分析的实用技巧
单纯看文本效率低,建议搭配工具提升分析效率:
- 用 gceasy.io 或 GCViewer 上传日志,自动生成吞吐率、暂停时间分布、内存趋势图
- 用 awk/sed/grep 快速统计:例如 grep "GC(.*Pause.*Young" gc.log | wc -l 统计 YGC 次数;awk '/Pause Full/{sum+=$NF} END{print sum}' gc.log 累加 Full GC 总耗时
- 开启 -XX:+PrintAdaptiveSizePolicy(仅 JDK 8)可观察 JVM 如何动态调整各代大小,帮助理解 GC 决策逻辑
- 生产环境建议同时开启 -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -Xlog:vm+heap=debug(JDK 11+)捕获堆内存布局细节,用于深入分析碎片或晋升异常
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











