首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 調優實戰:OutOfMemoryError 深度分析與解決方案

     編輯:Java 綜合教學

JVM 調優實戰:OutOfMemoryError 深度分析與解決方案

簡介

OutOfMemoryError 意味著 JVM 需要申請更大的記憶體,但受限於堆內存設置無法滿足需求。解決方向主要有兩類:排查代碼邏輯問題,或調整 JVM 內存參數。

一、排查代碼邏輯問題

首先檢查是否存在死循環持續創建並持有對象,導致記憶體洩漏。這類問題需通過代碼審查、Profiling 工具(如 VisualVM、JProfiler)定位對象來源並修復。

二、內存確實不足:老年代與永久代分析

(1) 老年代內存不足

現象: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。

(2) 永久代內存不足

現象: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 參數,並持續監控驗證效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved