在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)檢查老年代異常對象堆積。參考來源: