? ? ? ? 最近,看到短視頻傳播了一個使用jstack來協助排查CPU飆升的案例。我也是比較感興趣,參考了視頻博主的流程,自己做了下對應案例的實戰演練,在此,想做一下,針對相關問題模擬與排查演練的實戰過程記錄。
? ? ? ? 案例中所使用的DEMO代碼,我已經放到了以下的代碼倉庫中,有需要的同學,可以自行下載與學習演練。代碼倉庫地址:https://github.com/AlickLiubc/cpu-problems-demo
? ? ? ? 在演練代碼中,主要通過一段死循環,來模擬了系統CPU飆升的代碼原因。
具體步驟:
步驟1:
將代碼打成jar包并放置在Linux的系統運行環境中運行:
mvn clean package -DskipTests
nohup java -jar cpu-problems-demo-1.0-SNAPSHOT.jar > /dev/null 2> /dev/null &
步驟2:
通過瀏覽器打開與觀察接口的問題現象,如下圖所示,瀏覽器處于不斷加載的過程中:
步驟3:
使用top命令,查看占用CPU比較高的進程ID(十進制),可以看到PID=16013的進程占用CPU很高。
top
步驟4:
進一步使用top命令查詢占用CPU比較高的線程ID
top -H -p 16013
此時,可以得到占用CPU很高的線程ID(十進制),PID=16029。
步驟5:
將步驟4中得到的十進制的線程ID轉換為十六進制值為0x3e9d:
printf "0x%x\n" 16029
步驟6:
結合以上步驟中得到的進程ID(十進制)與線程ID(十六進制),可以找到問題源頭的相關代碼信息:
jstack 16013 | grep 0x3e9d-A 20