一、什么是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
