1. 程式人生 > 實用技巧 >Java線上記憶體溢位問題排查步驟

Java線上記憶體溢位問題排查步驟

參考:

java線上記憶體溢位問題排查步驟面試官:說一下記憶體溢位排查過程和工具?我...如何使用MAT進行記憶體洩露分析

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檔案
在MAT工具中一般用到比較多的2個功能
1、Histogram
2、Leak Suspects

Histogram

這個功能主要是檢視類和物件關係,物件和物件之間的關係,用來定位哪些物件在FGC之後還活著,哪些物件佔大部分記憶體。

Leak Suspects

Leak Suspects 介面提示可能存在記憶體的洩露。有的時候具體程式碼的位置都幫我們定位好了,排查非常方便。

JVM加上 -XX:+HeapDumpOnOutOfMemoryError這個引數,系統oom的時候會自動dump的,到時候拿快照MAT中分析即可。