Ubuntu Tomcat日志中的GC(垃圾回收)信息如何解读
小樊
41
2025-12-21 21:22:09
Ubuntu Tomcat GC日志解读指南
一 开启与定位GC日志
- 编辑 Tomcat/bin/catalina.sh,在 JAVA_OPTS 中增加以下常用参数(按需选择):
- 基础与滚动:
- -Xms 与 -Xmx:设置堆的初始与最大值(如 -Xms1g -Xmx2g)。
- -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCCause:打印GC与原因。
- -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps:时间信息。
- -Xloggc:$CATALINA_BASE/logs/gc.log:输出文件路径。
- -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M:滚动日志。
- 停顿与堆细节:
- -XX:+PrintGCApplicationStoppedTime:GC造成的应用暂停时间。
- -XX:+PrintHeapAtGC:GC前后堆的详细信息。
- -XX:+PrintTenuringDistribution:对象年龄分布。
- 重启 Tomcat 后在 $CATALINA_BASE/logs/ 查看 gc.log。示例片段:
- 3.448: [GC (Metadata GC Threshold) [PSYoungGen: 10749K->5119K(71680K)] 17251K->12177K(159232K), 0.0103527 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
- 3.459: [Full GC (Metadata GC Threshold) [PSYoungGen: 5119K->0K(71680K)] [ParOldGen: 7058K->6474K(50688K)] 12177K->6474K(122368K), [Metaspace: 20292K->20292K(1067008K)], 0.0454318 secs] [Times: user=0.09 sys=0.00, real=0.05 secs]
- 提示:不同垃圾收集器(如 Parallel、CMS、G1)日志格式略有差异,阅读时以收集器名称为线索。
二 日志字段逐条解读
- 时间戳:如 3.448(单位秒,自JVM启动起),若启用 PrintGCDateStamps 则为日期时间格式。
- GC类型:
- [GC]:年轻代回收(通常伴随短暂停顿)。
- [Full GC]:整堆回收,通常停顿更长;如 [Full GC (System)] 表示由 System.gc() 触发。
- 区域与内存变化:
- 年轻代示例:[PSYoungGen: 10749K->5119K(71680K)] 表示“回收前已用 -> 回收后已用(该区域总容量)”。
- 老年代示例:[ParOldGen: 7058K->6474K(50688K)]。
- 堆总体示例:17251K->12177K(159232K)。
- 元空间示例:[Metaspace: 20292K->20292K(1067008K)](JDK 8+ 使用 Metaspace 而非 PermGen)。
- 耗时与CPU时间:
- 本次GC耗时:如 0.0103527 secs。
- [Times: user=0.02 sys=0.00, real=0.01 secs]:user/sys 为CPU时间(可叠加超过 real),real 为墙钟时间(含等待)。
- 触发原因:如 (Metadata GC Threshold) 表示元空间阈值触发的GC。
三 常见收集器日志特征
- Parallel GC(默认常见于 JDK 8):年轻代名多为 PSYoungGen,老年代名多为 ParOldGen,日志字段直观,便于统计吞吐量与停顿。
- CMS(Concurrent Mark-Sweep):老年代并发回收,日志会出现并发阶段标记/清理信息;并发模式失败可能退化为 Full GC。
- G1 GC:区域化、停顿时间优先,日志包含年轻代回收(如 G1 Young GC)、并发标记周期(如 GC pause (G1 Evacuation Pause))等阶段信息,字段命名与 Parallel/CMS 不同。
四 快速判断与优化方向
- 频繁 Young GC:年轻代空间不足或对象晋升过快。可考虑适度增大 -Xmn/-XX:NewRatio、优化短生命周期对象创建与缓存策略。
- 频繁 Full GC:
- 元空间相关(如 Metadata GC Threshold):增大 -XX:MetaspaceSize/-XX:MaxMetaspaceSize。
- 老年代空间不足:增大 -Xmx,或检查是否存在内存泄漏与大对象长期存活。
- 停顿过长:
- 使用 G1 并设置合理的停顿目标(如 -XX:MaxGCPauseMillis),避免过度严苛影响吞吐。
- 使用 Parallel 时可结合 -XX:+UseAdaptiveSizePolicy 与目标停顿/吞吐策略进行自动调优。
- 辅助定位命令(配合日志分析):
- jstat -gcutil 观察各区使用率与GC频率。
- jmap -heap 查看堆配置与使用情况;必要时 jmap -histo 或生成 heap dump 用 MAT 分析。
五 可视化与工具
- 在线工具:上传 gc.log 到 gceasy.io,可快速得到吞吐量、停顿时间、触发原因等图表与建议。
- 桌面工具:GCViewer 可查看概要、停顿、内存趋势与事件详情,适合离线深入分析。