爲了模擬出CPU佔用過高的問題,特地寫了一個死循環的簡單測試程序。如下
在CentOS上編譯執行。
#javac TestDeadLoop.java
#java TestDeadLoop
用top命令找到CPU佔用過高的進程ID。
#top
可以看到現在總的%CPU:34.4us。
PID爲26932的java進程的%CPU達到了101.0%。
用ps -aux | grep pid
可以看到這個java進程就是java TestDeadLoop。
進一步用 ps -mp 26932 -o THREAD,tid,time | sort -rn命令
查看是哪個線程佔用cpu過高。
可以看到TID爲26944的線程的%CPU達到了97.2%.
先將將線程ID轉換爲16進制數。
[root@test_host ~]# printf "%x\n" 26944
6940
然後用jstack找到罪魁禍首。
可以看到問題出在TestDeadLock.java的第14行。