先執行一個java程序裏面開了兩個線程分別都在while循環作打印操做。 java
# java -cp ./test-threads.jar com.spiro.Main
經過top命令查看當前CPU狀況
shell
能夠看到有個java進程佔用CPU太高,下面來排查是什麼線程的什麼代碼致使CPU太高。 windows
先得到PID爲2023,上圖能夠看到,或者經過jps命令獲取。 執行如下命令: 性能
# top -H -p2023
說明: -H 指顯示線程,-p 是指定進程spa
結果:線程
能夠看到兩個CPU佔用較高的線程,記下PID 2033和2034 ( 此處的PID即爲線程ID標識) ,將其從十進制轉成十六進制表示,可經過windows自帶的計算器來轉。獲得結果分別爲7f1和7f2
code
再經過jstack命令獲取當前線程棧,可暫時保存到一個文件tempfile.txt中; 進程
# jstack -l 2023 > tempfile.txt
在tempfile.txt中查找nid=0x7f1的線程: class
能夠看到咱們找到的線程Thread-0,以及該線程的狀態和正在執行的代碼行,本例中顯示當前正在執行Worker類的15行。而後可去代碼中查看不合理的邏輯
thread
該方法頗有用,屢次使用該方法定位出程序中的性能問題,在此分享和記錄。