Tomcat日志中的GC日志怎么分析
导读:Tomcat GC日志分析与排查指南 一 开启与采集GC日志 推荐在 $CATALINA_BASE/bin/setenv.sh(没有则创建)中配置,避免与系统级 JAVA_OPTS 混淆;日志建议按天切割,便于分析。 常用JVM参数(按需...
Tomcat GC日志分析与排查指南
一 开启与采集GC日志
- 推荐在 $CATALINA_BASE/bin/setenv.sh(没有则创建)中配置,避免与系统级 JAVA_OPTS 混淆;日志建议按天切割,便于分析。
- 常用JVM参数(按需组合,示例为 JDK 8 常用组合):
- 基础日志:
- -verbose:gc
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDateStamps
- -Xloggc:$CATALINA_BASE/logs/gc-$(date +“%Y-%m-%d”).log
- 暂停与应用并发时间:
- -XX:+PrintGCApplicationStoppedTime
- -XX:+PrintGCApplicationConcurrentTime
- 堆与代信息:
- -XX:+PrintHeapAtGC
- -XX:+PrintTenuringDistribution
- 示例(放在 setenv.sh 的 CATALINA_OPTS 中):
- export CATALINA_OPTS=“-Xms2g -Xmx2g -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -Xloggc:$CATALINA_BASE/logs/gc-$(date +"%Y-%m-%d").log”
- 基础日志:
- 日志切割(/etc/logrotate.d/jvm):
- /var/log/jvm/*.log {
- rotate 300
- size 500M
- dateext
- missingok
- }
- /var/log/jvm/*.log {
- 重启 Tomcat 后确认日志已生成,并观察是否有异常频繁 GC 或长暂停。
二 读懂GC日志的关键字段
- 时间与应用暂停:
- 时间戳格式如:2024-03-10T12:34:56.789-0800 或自JVM启动的秒数(如 0.150)。
- [Times: user=…, sys=…, real=…]:其中 real 是应用暂停时间(秒),是评估停顿的关键指标。
- 若开启 -XX:+PrintGCApplicationStoppedTime,会单独打印“Total time for which application threads were stopped”。
- 代际与收集器标识:
- 年轻代常见:PSYoungGen(Parallel Scavenge)、ParNew(配合 CMS)、G1 Young(G1)。
- 老年代常见:PSOldGen(Parallel Old)、CMS、G1 Old。
- 内存变化与原因:
- 典型片段:[PSYoungGen: 4096K->
1024K(8192K)] 4096K->
2048K(16384K), 0.0023457 secs
- 含义:年轻代 GC 前后使用量由 4096K→1024K,该代总容量 8192K;整堆由 4096K→2048K,整堆容量 16384K;本次耗时 0.0023457 secs。
- 原因如 (Allocation Failure) 表示年轻代空间不足触发 GC;Full GC (System) 常见于显式调用或系统类加载等场景。
- 典型片段:[PSYoungGen: 4096K->
1024K(8192K)] 4096K->
2048K(16384K), 0.0023457 secs
三 常见异常模式与定位要点
- 频繁 Young GC:年轻代容量偏小或对象晋升过快。检查 Eden/Survivor 设置与晋升阈值,结合对象生命周期优化短命对象创建与缓存策略。
- Full GC 频繁或单次耗时过长:老年代空间紧张或碎片。关注老年代使用曲线、晋升速率与 GC 原因;CMS 需关注并发模式失败与碎片整理策略。
- 长暂停(real 明显偏大):优先看 real 时间,结合收集器类型判断是否为并发阶段受阻或堆过大导致回收慢;必要时降低堆或切换/调优收集器参数。
- 元空间(Metaspace)或永久代(PermGen)问题(JDK 7 及更早):观察 PermGen/Metaspace 使用是否持续增长并触发 Full GC,排查类加载泄漏。
- 快速排查命令(配合日志分析):
- 统计 Full GC 频率:grep Full gc.log | wc -l
- 实时观察各区使用:jstat -gcutil 1000 60
- 查看堆配置与分区:jmap -heap
- 抓取堆转储分析泄漏:jmap -dump:format=b,file=heap.hprof (再用 MAT 等分析)。
四 用工具快速分析
- 可视化与统计工具:
- gchisto:统计 GC 次数、时间分布、Young/Full 对比,适合版本前后对比。
- GCLogViewer:趋势图、吞吐量、平均频率、内存变化趋势,支持日志对比。
- GCViewer:图形化查看停顿与回收趋势(注意版本兼容)。
- garbagecat:命令行解析与报表生成,便于集成到流水线。
- 在线工具:gceasy.io,上传日志即可生成可视化报告与诊断建议。
五 优化方向与落地建议
- 堆大小与代际配比:
- 建议 -Xms 与 -Xmx 设为相同,避免运行期扩缩堆带来的抖动。
- 使用 G1 时通常无需显式设置新生代;使用并行/CMS 时可考虑 -Xmn ≈ 堆的 3/8,并结合 -XX:SurvivorRatio 调整 Eden/Survivor 比例。
- 收集器选择(按目标权衡):
- 吞吐量优先:-XX:+UseParallelGC / -XX:+UseParallelOldGC,可配合 -XX:MaxGCPauseMillis 与自适应策略。
- 响应时间优先:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC(CMS 并发标记清除,注意碎片与并发失败处理)。
- 大堆与可预测停顿:-XX:+UseG1GC(区域化分代、并发标记、可设定停顿目标)。
- 日志与监控常态化:
- 保持 GC 日志长期落盘与按天切割;结合 jstat/jmap 与可视化工具建立基线,出现异常时对比历史趋势定位回归点。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Tomcat日志中的GC日志怎么分析
本文地址: https://pptw.com/jishu/775876.html
