linux

Tomcat日志中的GC日志分析技巧

小樊
46
2025-08-14 11:22:59
栏目: 智能运维

一、GC日志生成配置

在Tomcat启动脚本(bin/catalina.sh)中添加JVM参数,启用GC日志记录:

JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/path/to/gc.log"

二、日志核心内容解析

  1. 日志结构与关键字段

    • 时间戳2025-08-14T10:00:00.123+0800,表示GC发生时间。
    • GC类型
      • [GC:普通GC(Minor GC,年轻代回收)。
      • [Full GC:全局GC(老年代/元空间回收,可能伴随STW停顿)。
    • 区域信息
      • PSYoungGen/DefNew:年轻代(不同收集器名称不同,如Serial、Parallel等)。
      • Tenured/Old:老年代。
      • MetaSpace:元空间(JDK8+)。
    • 内存变化GC前使用量->GC后使用量(总容量),如1024K->512K(2048K)
    • 耗时0.001s(用户态CPU时间、系统态CPU时间、墙钟时间)。
  2. 典型场景分析

    • 频繁Young GC
      • 日志特征:[GC (Allocation Failure)频繁出现,年轻代回收后使用量持续较高。
      • 可能原因:新生代空间过小、对象存活率高,需调整-Xmn-XX:SurvivorRatio
    • Full GC频繁
      • 日志特征:[Full GC出现频率高,伴随老年代/元空间使用量接近满。
      • 可能原因:老年代空间不足、内存泄漏,需增大堆内存或排查代码问题。
    • 长时间STW
      • 日志中耗时较高的Full GC记录,可能因老年代碎片过多或并发收集器配置不当。

三、分析工具推荐

  1. 命令行工具

    • grep:过滤关键信息,如grep "Full GC" gc.log
    • awk:统计GC次数、耗时,如awk '/[Full GC]/ {count++; sum+=$9} END {print "Full GC次数:", count, "总耗时:", sum}' gc.log
  2. 可视化工具

    • GCEasy:在线分析工具,生成GC趋势图、吞吐量等报告。
    • GCViewer:支持多种收集器日志解析,可直观查看内存回收情况。
    • ELK Stack:对大规模日志进行聚合分析,适合生产环境。

四、优化建议

参考来源

0
看了该问题的人还看了