在Tomcat启动脚本(bin/catalina.sh)中添加JVM参数,启用GC日志记录:
JAVA_OPTS="$JAVA_OPTS -Xms512m -Xmx512m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/path/to/gc.log"
-Xms/-Xmx:设置堆内存初始值和最大值。-XX:+PrintGCDetails:打印GC详细信息,包括各区域回收前后使用量、耗时等。-Xloggc:指定GC日志输出路径。日志结构与关键字段
2025-08-14T10:00:00.123+0800,表示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时间、墙钟时间)。典型场景分析
[GC (Allocation Failure)频繁出现,年轻代回收后使用量持续较高。-Xmn或-XX:SurvivorRatio。[Full GC出现频率高,伴随老年代/元空间使用量接近满。命令行工具
grep:过滤关键信息,如grep "Full GC" gc.log。awk:统计GC次数、耗时,如awk '/[Full GC]/ {count++; sum+=$9} END {print "Full GC次数:", count, "总耗时:", sum}' gc.log。可视化工具
-Xmn),减少老年代压力。jmap -histo或内存分析工具(如MAT)检查老年代异常对象堆积。参考来源: