參考:
Java線上內存溢出問題排查步驟
1、使用top對當前服務器內存有個大致了解,top后 shift+M俺內存占用由大到小排序
2、利用ps命令查看服務pid:ps -aux|grep java
3、利用jstat查看虛擬機gc情況
jstat -gc:util <vmid> [<interval> [<count>]
vmid:虛擬機進程號
interval:采樣時間,默認單位是ms
count:采樣條數
[root@speedyao java]# jstat -gcutil 17561 1000 10
以上命令代表1秒鍾采樣1次,總共采樣10次。
如果FULL GC明顯大於YOUNG GC次數,並且FULL GC次數很頻繁,說明程序有大內存對象,並且一直無法釋放。
4、生成dump文件,有兩種方式。 一種是利用jmap直接生成dump文件;另一種是利用gcore先生成core文件,再根據core文件利用jmap生成dump文件。
(1)先說第一種,這種比較簡單,使用這種方案的時候請注意:JVM會將整個heap的信息dump寫入到一個文件,heap如果比較大的話,就會導致這個過程比較耗時,並且執行的過程中為了保證dump的信息是可靠的,所以會暫停應用。
[root@speedyao java]# jmap -dump:format=b,file=heap.prof 17561
format=b:表示生成二進制類型的dump文件 file=:后面寫的是輸出的dump文件路徑
17561:jvm進程id
(2)接下來是第二種。這一種在jmap轉換core文件的時候比較耗時,並且生成的dump文件用mat打開的時候分析結果不太正確,不太好定位問題。所以我建議使用第一種,雖然會造成服務掛起吧,但是結果總歸是正確的。
優勢:利用gcore保存服務的內存信息,因為gcore比jmap的dump會快很多,也不對線上服務有大的影響。
利用jmap將gcore文件轉換為java的dump文件,這一步執行的比較慢,可以用nohup執行,以防止誤點Ctrl+C導致退出。
5、利用MAT或者 jdk自帶的jvisualvm.exe 來分析dump文件
5、利用MAT或者 jdk自帶的jvisualvm.exe 來分析dump文件
在MAT工具中一般用到比較多的2個功能
1、Histogram
2、Leak Suspects
1、Histogram
2、Leak Suspects
Histogram
這個功能主要是查看類和對象關系,對象和對象之間的關系,用來定位哪些對象在FGC之后還活着,哪些對象占大部分內存。
Leak Suspects
Leak Suspects 界面提示可能存在內存的泄露。有的時候具體代碼的位置都幫我們定位好了,排查非常方便。
JVM加上 -XX:+HeapDumpOnOutOfMemoryError 這個參數,系統
oom的時候會自動dump的,到時候拿快照MAT中分析即可。