Java GC 日志分析实战指南
一 启用与采集日志
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC-Xloggc:/var/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M-Xlog:gc*:file=gc.log:time二 快速判读关键字段
[GC (Allocation Failure)](新生代分配失败)、[Full GC (Metadata GC Threshold)](元空间阈值)、[GC pause (G1 Humongous Allocation)](大对象分配)。[Eden: 24.0M(24.0M)->0.0B(20.0M) Survivors: 0.0B->4.0M Heap: 24.0M(256.0M)->20.4M(256.0M)][Times: user=0.09 sys=0.00, real=0.01 secs]real 是应用实际停顿(STW);user+sys 为 GC 线程 CPU 时间总和,通常 real × 并行线程数 ≈ user+sys。[Metaspace: 2560K->2560K(1056768K)](JDK 8+ 为元空间,早期为永久代)。若持续增长并触发 Full GC,需排查类加载与泄漏。三 系统化分析流程
Allocation Failure、Metadata GC Threshold、G1 Humongous Allocation)。-XX:+PrintTenuringDistribution 查看对象年龄分布,判断晋升阈值 -XX:MaxTenuringThreshold 是否合理。Humongous Allocation 与 Mixed GC 频率;CMS:留意并发阶段失败导致的 Full GC;Parallel:更偏向吞吐量。四 常见症状 日志特征 与处置建议
| 症状 | 日志特征 | 处置建议 |
|---|---|---|
| 频繁 Minor GC | [GC (Allocation Failure)] 高频出现,Eden 快速填满 |
增大新生代(-Xmn 或 -XX:NewRatio)、降低短期对象分配峰值、优化对象生命周期 |
| 频繁 Full GC | [Full GC (Metadata GC Threshold)] 或老年代空间不足触发 |
增大老年代(-Xms/-Xmx 等值)、检查并限制元空间 -XX:MetaspaceSize=… -XX:MaxMetaspaceSize=…、排查内存泄漏 |
| 长时间停顿 | [GC pause …] 超过 500ms,如 G1 Humongous Allocation |
减少大对象分配、优化 Region 大小(G1)、切换/调优低延迟收集器(如 G1/ZGC)、控制堆规模 |
| 过早晋升 | Tenuring Distribution 显示低龄对象大量晋升 |
增大 Survivor 区或调整 -XX:MaxTenuringThreshold、降低对象存活率 |
| CMS 并发失败 | 出现 concurrent mode failure 并触发 Full GC |
降低并发标记压力(增大堆/老年代、减少对象晋升)、调整 CMS 相关参数或迁移至 G1/ZGC |
| 元空间持续增长 | [Metaspace: …->…(max …)] 逐步逼近上限 |
设置合理的 MaxMetaspaceSize、排查类加载器泄漏与重复类定义 |
| 以上特征与处置要点可结合日志关键字与代际变化快速验证与落地优化。 |
五 工具与命令清单
grep "GC" gc.log | wc -l、grep "Full GC" gc.log | wc -lawk '/GC.*secs/ {sum+=$NF} END {print "Average GC time: " sum/NR " secs"}' gc.loggrep "\[Heap\]" gc.log | awk '{print $6, $8}'gc.log 生成趋势、停顿、代际图表与建议-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -Xloggc:/var/log/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M-Xlog:gc*:file=gc.log:time
这些工具能显著缩短定位时间,并帮助验证优化效果是否达标。