關於JVM CPU資源佔用太高的問題排查

1、背景:

    先執行一個java程序裏面開了兩個線程分別都在while循環作打印操做。     java

# java -cp ./test-threads.jar com.spiro.Main

2、現象:

    經過top命令查看當前CPU狀況
shell

    

    能夠看到有個java進程佔用CPU太高,下面來排查是什麼線程的什麼代碼致使CPU太高。 windows

3、步驟

    先得到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

4、總結

    該方法頗有用,屢次使用該方法定位出程序中的性能問題,在此分享和記錄。

相關文章
相關標籤/搜索