這里主要是對jstack命令的使用;
程序在運行過程中卡主,前端無法訪問,一看服務器CPU占用達到200到300%多。
排查思路
1)找出占用高的進程
2)找出占用高的線程
3)找出具體的代碼
分析步驟:
第一步:使用 top 找到占用 CPU 最高的 Java 進程 pid (1966)
第二步:用 top -Hp pid 命令查看占用 CPU 最高的線程
????????top -Hp 1966
????????shift+p 按cpu排序,shift+m 按內存排序
?? ?
????????就可以獲取到這個進程下面所有線程,通過查看%CPU找到最耗費CPU的是線程PID 2912
第三步:用 printf '%x\n' PID 線程id轉換成16進制 b60
????????printf '%x\n' 2912
? ? ? ? b60
第四步,使用jstack 獲取對應的線程信息?
????????jstack 1966 | grep b60
?? ?
????????結果報了一個錯誤:1966: Unable to open socket file: target process not responding or HotSpot VM not loaded
? ? ? ? The -F option can be used when the target process is not responding
????????解決方案:
????????首先檢查用戶權限,jstack需要使用與進程一致的用戶才能執行,即使是root,命令加上sudo?
????????如果是使用了docker來啟動,解決方法:需要進入到容器中去執行jstack命令。
????????
????????jstack 1966 | grep b60 -C4 --color,找到具體的代碼? ?
? ? ? ? 找到前后四行的代碼
第五步,用轉換的16進制在線程棧的信息里全局搜索,線程名稱,線程狀態,具體的哪一行代碼都可以查到
參考文章:
JVM線程、內存問題排查_jvm 線程8000多-CSDN博客
jstack日志深入理解_jstack日志分析-CSDN博客