Java線上記憶體溢位問題排查步驟
阿新 • • 發佈:2020-12-19
參考:
java線上記憶體溢位問題排查步驟面試官:說一下記憶體溢位排查過程和工具?我...如何使用MAT進行記憶體洩露分析Java線上記憶體溢位問題排查步驟
1、使用top對當前伺服器記憶體有個大致瞭解,top後 shift+M俺記憶體佔用由大到小排序2、利用ps命令檢視服務pid:ps -aux|grep java3、利用jstat檢視虛擬機器gc情況
jstat -gc:util <vmid> [<interval> [<count>]
vmid:虛擬機器程序號
interval:取樣時間,預設單位是ms
count:取樣條數
以上命令代表1秒鐘取樣1次,總共取樣10次。[root@speedyao java]# jstat -gcutil 17561 1000 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檔案
1、Histogram
2、Leak Suspects
Histogram
這個功能主要是檢視類和物件關係,物件和物件之間的關係,用來定位哪些物件在FGC之後還活著,哪些物件佔大部分記憶體。Leak Suspects
Leak Suspects 介面提示可能存在記憶體的洩露。有的時候具體程式碼的位置都幫我們定位好了,排查非常方便。
JVM加上 -XX:+HeapDumpOnOutOfMemoryError這個引數,系統oom的時候會自動dump的,到時候拿快照MAT中分析即可。