當伺服器記憶體飙升或者cpu負載飙升的時候,可以使用如下步驟排查問題:
1、終端輸入top指令,鍵盤大寫的情況下按P(cpu負載率從高到低排序)或者M(記憶體使用率從高到低排序),可以檢視導緻cpu或者記憶體飙升的java pid。
2、jstack PID号 > jstack.log
上面的指令可以儲存目前時刻的線程棧到 jstack.log 檔案中(儲存在目前路徑下)
3、分析棧檔案
3.1 grep 'java.lang.Thread.State' jstack.log | wc -l
上述指令可以統計java.lang.Thread.State出現的次數
3.2 grep -A 1 'java.lang.Thread.State' jstack.log | grep -v 'java.lang.Thread.State' | sort | uniq -c |sort -n
該指令可以将線程棧檔案的狀态按次數排序顯示
4、jmap -dump:format=b,file=heap.log pid
上述指令可以儲存目前的堆情況到heap.log檔案中。
5、将heap.log傳輸到windows系統下,複制一份,字尾改成.hprof
下載下傳Eclipse的記憶體分析工具,位址:https://www.eclipse.org/mat/downloads.php
下載下傳完成後,輕按兩下MemoryAnalyzer.exe,點選Open a Heap Dump
選擇桌面上的堆檔案,點選打開:
選擇第一個記憶體分析報告,然後點Finish:
就會打開一個總體情況頁面:
點選左下角的Table Of Contents,裡面有多種分析供選擇:
每一個選項幾乎都有直覺的餅狀圖顯示對象的占用情況:
當然也有線程的堆使用情況分析,可以友善地找到占用大量記憶體的線程,找到真正導緻記憶體、cpu飙升的罪魁禍首!