CPU異常往往是業務邏輯問題(死循環)、頻繁gc以及上下文切換過多。而最常見的往往是業務邏輯(或者框架邏輯)導致的,可以使用jstack來分析對應的堆棧情況,本文通過死循環方式重現CPU過高場景,並實例講解CPU過高問題排查的方式。
1.環境
- Centos7 1核2GB
- Java8
2.模擬cpu佔用高
創建 cpu-over-test 項目,添加了一個MyMainClazz類。裏面有一個可是要 java -jar 執行的Main方法
模擬代碼如下
public class MyMainClazz {
public static void main(String[] args) {
System.out.println("run start ...");
while (true) {
}
}
}
cpu-over-test-1.0.jar
下載地址:https://pan.baidu.com/s/1-VTQ02qrb1l010MiFshHzw
密碼:iqjl
3.啓動模擬程序
- cpu-over-test.jar上傳到服務器
- 啓動命令
nohup java -jar cpu-over-test-1.0.jar &
啓動成功示例:
啓動成功後,幾秒功夫就看到cpu 百分之百了
4.問題排查四步驟
4.1.查看佔用CPU高的進程
top
如下圖:整體CPU高達96.3%
可看出PID爲 14855 的java進程佔用cpu最高,達到了92.3%
4.2.查看進程中最耗CPU的子線程
使用命令:top -p 進程pid -H
top -p 14855 -H
如下圖:可看出PID爲14856的線程佔用cpu最高,達到了92.3%
4.3最耗CPU的線程id轉換爲16進制
使用命令:printf “%x \n” 線程PID
printf "%x \n" 14856
4.4查看具體出現問題的代碼位置
使用命令:jstack 進程pid | grep 線程ID轉換爲16進制值 -C20
jstack 14855 | grep 3a08 -C20