+-------------------------+
| Heap (堆) | ← 開發人員管理,GC 主戰場
| +-------------------+ |
| | Young Gen (新生代) | | Eden + S0 + S1
| | Old Gen (老年代) | | 長期存活物件
| +-------------------+ |
+-------------------------+
| Non-Heap (非堆) | ← JVM 內部使用
| +-------------------+ |
| | Metaspace (元空間) | | 類別元資料(JDK 8+ 取代 PermGen)
| | Code Cache | | JIT 編譯代碼
| +-------------------+ |
+-------------------------+
-Xmx 設定過小-Xms 初始堆、-Xmx 最大堆(建議設相同值避免震盪)-Xmn 或 -XX:NewRatio(建議 1:2 或 1:3)-XX:PermSize=128m -XX:MaxPermSize=256m-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m-XX:+CMSClassUnloadingEnabled (CMS) 或 G1 預設支援System.gc()、堆內存不足連續 GC 失敗98% 時間在 GC 且釋放 < 2% 堆 → 拋 OOM# Linux: $CATALINA_HOME/bin/setenv.sh
export JAVA_OPTS="-server \
-Xms4g -Xmx4g \
-XX:NewSize=1g -XX:MaxNewSize=1g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:+HeapDumpOnOutOfMemoryError \
-XX:HeapDumpPath=/opt/tomcat/logs/heapdump.hprof \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-Xloggc:/opt/tomcat/logs/gc.log"
| 參數 | 建議值 | 說明 |
|---|---|---|
-Xms / -Xmx | 實體記憶體 50%-70% | 設相同避免伸縮 |
-Xmn | 堆 1/3 ~ 1/4 | 新生代過大導致 Old Gen 過小觸發頻繁 Full GC |
-XX:SurvivorRatio | 8 (預設) | Eden : Survivor = 8 : 1 : 1 |
-XX:+UseG1GC | JDK 9+ 預設 | 大堆、低延遲首選 |
-XX:MaxGCPauseMillis | 100-200ms | G1 目標停頓時間 |
-XX:+HeapDumpOnOutOfMemoryError | 必開 | OOM 時自動產生堆轉儲檔 |
remove()(執行緒池場景)Tomcat OOM 核心在於堆與元空間大小規劃、GC 策略選型、洩漏預防。建議:
-Xms/-Xmx、Metaspace