簡介
OutOfMemoryError 意味著 JVM 需要申請更大的記憶體,但受限於堆內存設置無法滿足需求。解決方向主要有兩類:排查代碼邏輯問題,或調整 JVM 內存參數。
首先檢查是否存在死循環持續創建並持有對象,導致記憶體洩漏。這類問題需通過代碼審查、Profiling 工具(如 VisualVM、JProfiler)定位對象來源並修復。
現象:Full GC 結束後,老年代佔用空間接近或等於最大值。典型 GC 日誌如下:
2016-01-19T14:18:19.883+0800: 179.163: [CMS-concurrent-reset-start]
2016-01-19T14:18:19.893+0800: 179.173: [CMS-concurrent-reset: 0.009/0.009 secs]
{Heap before GC invocations=154 (full 1):
par new generation total 943744K, used 850746K ...
concurrent mark-sweep generation total 1560576K, used 1560576K ...
concurrent-mark-sweep perm gen total 159744K, used 69030K ...}
解決:調大 -Xms、-Xmx 並保持新生代大小不變,直到不再出現 java.lang.OutOfMemoryError: Java heap space。
現象:Full GC 後永久代佔用接近最大值。典型 GC 日誌:
... perm gen total 159744K, used 159744K ...
解決:調大 -XX:PermSize、-XX:MaxPermSize(JDK 8+ 已移除永久代,改為 Metaspace,需調整 -XX:MetaspaceSize、-XX:MaxMetaspaceSize),直到不再出現 java.lang.OutOfMemoryError: PermGen space。
遇到 OOM 先查代碼,再看 GC 日誌判斷是老年代還是永久代/元空間不足,針對性調整 JVM 參數,並持續監控驗證效果。