天天看點

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

當伺服器記憶體飙升或者cpu負載飙升的時候,可以使用如下步驟排查問題:

1、終端輸入top指令,鍵盤大寫的情況下按P(cpu負載率從高到低排序)或者M(記憶體使用率從高到低排序),可以檢視導緻cpu或者記憶體飙升的java pid。

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

2、jstack PID号 > jstack.log

上面的指令可以儲存目前時刻的線程棧到 jstack.log 檔案中(儲存在目前路徑下)

3、分析棧檔案

3.1 grep 'java.lang.Thread.State' jstack.log  | wc -l

上述指令可以統計java.lang.Thread.State出現的次數

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

3.2  grep -A 1 'java.lang.Thread.State' jstack.log  | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n

該指令可以将線程棧檔案的狀态按次數排序顯示

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

4、jmap -dump:format=b,file=heap.log pid

上述指令可以儲存目前的堆情況到heap.log檔案中。

5、将heap.log傳輸到windows系統下,複制一份,字尾改成.hprof

下載下傳Eclipse的記憶體分析工具,位址:https://www.eclipse.org/mat/downloads.php

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

下載下傳完成後,輕按兩下MemoryAnalyzer.exe,點選Open a Heap Dump

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

選擇桌面上的堆檔案,點選打開:

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

選擇第一個記憶體分析報告,然後點Finish:

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

就會打開一個總體情況頁面:

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

點選左下角的Table Of Contents,裡面有多種分析供選擇:

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

每一個選項幾乎都有直覺的餅狀圖顯示對象的占用情況:

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析

當然也有線程的堆使用情況分析,可以友善地找到占用大量記憶體的線程,找到真正導緻記憶體、cpu飙升的罪魁禍首!

linux列印jvm記憶體堆棧_Linux下擷取java堆棧檔案并進行分析