Java內存溢出(Out Of Memory,簡稱OOM)Troubleshooting


 

1 問題描述

內存溢出(Out Of Memory,簡稱OOM)是指應用系統中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大於能提供的最大內存。此時程序就運行不了,系統會提示內存溢出,有時候會自動關閉軟件,重啟電腦或者軟件后釋放掉一部分內存又可以正常運行該軟件,而由系統配置、數據流、用戶代碼等原因而導致的內存溢出錯誤,即使用戶重新執行任務依然無法避免。

java.lang.OutOfMemoryError error is thrown when there is insufficient space to allocate an object in the Java heap.

       典型特征:控制台等日志會出現“java.lang.OutOfMemoryError:XXXX”異常日志。

       常見原因:大對象一次性分配一個大的內存空間、內存泄漏、JVM設置不當等。

 

 

2 故障排查

2.1 整體思路

整體思路:根據OOM類型明確溢出的內存區域+明確是否有泄漏+分析泄漏/對象生命周期/存儲結構/環境檢查等。

 

(1)根據控制台日志(**/jstack/runtime/log/loging.log)查看OOM具體信息。如:創建對象時分配的空間大於堆內存連續可用空間時導致的java.lang.OutOfMemoryError: Java heap space;進程98%以上的時間在執行GC,且連續5次GC回收空間在2%以內導致的java.lang.OutOfMemoryError: GC Overhead limit exceeded;MaxMetaspaceSize設置太小,且加載到Metaspace的class太多或太大導致的java.lang.OutOfMemoryError: Metaspace;棧幀太大或虛擬機棧容量太小導致新的棧幀內存無法分配時報出的StackOverflowError。

(2)通過start-jstack.sh啟動文件的JVM配置參數,或jcmd PID VM.flags命令可以查看JVM內存分配情況。

(3)抓取OOM時刻dump,結合控制台日志、環境配置、內存對象等信息明確OOM原因。

2.2 實施方案

2.2.1 抓取coredump

JVM參數中添加-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump/store,在出現OOM時即會自動抓取問題時刻coredump。(后續會在JVM參數中默認設置自動抓取OOM時刻dump)

2.2.2 coredump分析

MAT分析dump文件,結合dump分析的對象、線程、Leak Suspects以及JVM參數等信息分析出現OOM的原因。

一般思路,根據top對象明確相關的線程堆棧,根據線程堆棧明確業務場景,開發人員結合業務場景做進一步分析。

以MAT(https://www.eclipse.org/mat/ )為例,打開MAT,添加待分析文件File-Open Heap Dump…,選擇前面收集的dump文件之后即默認開始分析。

注意:MAT默認分配內存過小,在分析dump時會出現OOM,一般在分析生產環境coredump時,需要先調整MAT內存參數。具體方法為,修改工具目錄下的MemoryAnalyzer.ini文件,添加-Xmx12024m參數,可以結合工具所在機器情況,將MAT最大內存調大(如限制為物理內存的一半或80%)。

 

如下示例場景為,類加載過多導致的GC Overhead limit exceeded類OOM coredump。Leak Suspects report中,嫌疑的泄漏內容為線程org.apache.tomcat.util.threads.TaskThread @ 0xeef66240 http-nio-8080-exec-1的"javassist.ClassPool"占用了215,708,456 (占堆內存的92.21%)。之后點擊“See stacktrace”或“Details”即可查看內存泄漏嫌疑內容相關的線程堆棧和詳細內存信息。

 

 

 

 

 

2.2.3 幾個技巧

(1)檢查物理內存及JVM內存參數,JVM內存小於4G時,通常建議先增加JVM內存分配。

(2)重點關注TOP對象,如某對象數較其他在數量或占用大小明顯高於其他對象時,top內容一般為高嫌疑內容。

(3)在分析TOP內容時,重點關注產品相關內容。

3 解決方案

調整JVM參數、優化內存泄漏代碼、優化大對象等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM