【OOM】解決思路


一、什么是OOM?

     OOM就是outOfMemory,內存溢出!可能是每一個java人員都能遇到的問題!原因是堆中有太多的存活對象(GC-ROOT可達),占滿了堆空間。

 

二、怎么解決?

1、拿到內存溢出時的heapdump.hprof文件

        可在程序啟動時增加啟動參數:  -XX:+HeapDumpOnOutOfMemoryError  XX:HeapDumpPath=/test/test/test.hprof

        如果沒有加這個參數怎么辦?

        不用擔心,我們可以通過命令實時輸出這個文件:

             1、jps命令查到當前java服務的pid ;

             2、jmap -dump:live,format=b,file=/test/test/test.hprof pid ;

             3、去/test/test/文件夾下拿到test.hprof文件

注意:運行環境要安裝完整的jdk.(有的機器上可能只安裝了jre,那么jps、jmap這些命令就沒法使用了);/test/test/這個文件夾要提前創建,不然不會輸出hprof文件。

 

分析heapdump.hprof文件。

     2.1:分析heapdump.hprof文件,我推薦eclipse出的 MemoryAnalyzer 工具(https://www.eclipse.org/mat/downloads.php)。一般打開hprof文件后主要看兩個東西:

          Hisogram:內存直方圖

          Leak Suspects:內存溢出可能的原因

 

 

     2.2:針對不通類型的OOM,從不同角度着手。

          先說幾個Histogram參數:

          Objects:對象數量             

          Shallow Heap:  Shallow Size是對象本身占據的內存的大小,不包含其引用的對象。

          Retained Heap:Retained Size=當前對象大小+當前對象可直接或間接引用到的對象的大小總和。換句話說,Retained Size就是當前對象被GC后,從Heap上總共能釋放掉的內存。

 

       2.2.1:Metaspace/PermGen:瞄准Class對象,在Histogram中找到最多的Class對象

 

 

 

 

 

 

 

      2.2.2:Heap space:瞄准占空間最大的對象,在Histogram中找到heap最大的對象。

 

 

 

 

接下來就是去Path to GC Root去看代碼分析了,情況較多,既要了解JVM內存模型,又要具備扎實的Java基礎。然后結合自己代碼情況下手,就不展開了。

 后續我將介紹阿里的線上內存定位神器 Arthas

 


免責聲明!

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



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