Tomcat 日誌報錯:
Caused by: java.lang.OutOfMemoryError: allocLargeArray - Object size: 80040, Num elements: 40010
意指:嘗試分配 80,040 位元組的陣列(40,010 個元素),但 Heap 無可用空間。陣列在 JVM 中也是物件,分配於 Heap。
java -Xms64m -Xmx256m Test -Xms:初始 Heap 大小 -Xmx:最大 Heap 大小(勿超過物理記憶體)
WebLogic 可在 startWebLogic.cmd 或 commEnv.cmd 設定。
Heap 分三區:Young(新生代)、Old(老年代)、Permanent(永久代)。新建物件置於 Young,滿時 GC 移至 Old。Permanent 存放反射物件。
-Xms:初始 Heap-Xmx:最大 Heap-Xmn:Young 區大小Old 區大小 = -Xmx - Xmn。-Xms 過大會迫使第二 GC 線程頻繁運行降低性能。
System.gc() 或 Runtime.gc()StringBuffer 替代 String)-Xms = -Xmx,-Xmn ≈ -Xmx / 3-Xmx(含線程 Stack 等)-Xss 設定線程 Stack 大小,影響最大線程數;過大導致 OOM,過小導致 StackOverflow| 類型 | 特點 | 適用場景 | 啟動參數 |
|---|---|---|---|
| 單線程 GC | 預設 | 單 CPU | 無 |
| Throughput GC | Young 區多線程,Old 區單線程 | 多 CPU、大量線程 | -XX:+UseParallelGC |
| Concurrent Low Pause GC | Old 區回收同時運行應用 | 多 CPU、需縮短停頓 | -XX:+UseConcMarkSweepGC |
| Incremental Low Pause GC | Young 區回收同時回收部分 Old 區 | 需縮短停頓 | -Xincgc |
遭遇 allocLargeArray OOM,優先檢查 Heap 設定是否過小、是否存在記憶體洩漏或短命大物件分配。依據應用類型選擇適當 GC 策略,設定合理的 -Xms/-Xmx/-Xmn,並開啟 GC 日誌持續監控。記憶體調優是系統工程,需綜合代碼、配置、硬體多維度考量。