要分析Tomcat日志中的GC信息,首先需要开启GC日志记录。需修改Tomcat启动脚本(bin/catalina.sh或bin/catalina.bat),添加以下JVM参数:
-XX:+PrintGCDetails(打印GC详细信息,包括内存区域变化)、-XX:+PrintGCDateStamps/-XX:+PrintGCTimeStamps(添加时间戳,便于定位时间点)、-Xloggc:<路径>(指定GC日志输出文件,如-Xloggc:/opt/tomcat/logs/gc.log)。-XX:+UseGCLogFileRotation(开启日志滚动,避免单文件过大)、-XX:NumberOfGCLogFiles=5(保留最近5个日志文件)、-XX:GCLogFileSize=20M(单个日志文件最大20MB)。JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/tomcat/logs/gc.log"
修改后重启Tomcat使配置生效。
Tomcat使用的GC日志格式取决于垃圾收集器类型(如Serial、Parallel、CMS、G1等),核心字段包括:
Minor GC(年轻代GC,通常快速)、Major GC/Full GC(老年代GC,耗时较长,可能暂停整个应用)。2025-04-01T10:00:00.123+0800),帮助关联应用负载变化。PSYoungGen: 4096K->1024K(8192K),表示GC前使用4096K,回收后剩余1024K,总大小8192K。ParOldGen: 8192K->8192K(16384K),表示老年代GC前后无变化(未回收)。7680K->4096K(16384K),表示整堆GC前使用7680K,回收后剩余4096K,总大小16384K。0.0023457 secs,表示本次GC耗时约2毫秒,过长的持续时间会影响应用响应。通过GC日志提取以下指标,可定位内存问题:
-Xmn参数)、更换低停顿收集器(如G1 GC)。(GC前年轻代使用量 - GC后年轻代使用量) / GC前年轻代使用量。若回收率低(如<50%),可能年轻代过大(导致Full GC提前)或Survivor区设置不合理(-XX:SurvivorRatio参数)。Allocation Failure内存分配失败、Metadata GC Threshold元空间不足),帮助针对性解决:如Allocation Failure需增加年轻代大小,Metadata GC Threshold需扩大元空间(-XX:MaxMetaspaceSize)。手动解析GC日志繁琐,可使用工具可视化数据、生成报告:
-XX:+HeapDumpOnOutOfMemoryError参数生成),识别内存泄漏的根源(如大对象、对象引用链)。根据分析结果调整JVM参数,提升Tomcat性能:
-Xms和-Xmx设为相同值,避免动态扩容);若GC频率过高,可减小堆大小。-Xmn参数,如-Xmn512m);若老年代增长快,可减小年轻代。-XX:+UseG1GC);若吞吐量优先,可使用Parallel GC(-XX:+UseParallelGC)。