當服務器內存飆升或者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飆升的罪魁禍首!