天天看點

java多線程-cpu記憶體占用-定位分析

一,建立測試環境(windows)

二,定位

正文:

測試環境如下:

建立2個線程類,一個run死循環執行大量io,另一個run死循環執行1秒睡眠。main方法開啟4線程,上述每個開啟2個。

高占用如下:

java多線程-cpu記憶體占用-定位分析

下載下傳process explorer可檢視程序的詳細資訊:

java多線程-cpu記憶體占用-定位分析

可看出,java程序裡2個線程高占用cpu。

現在大概定位問題了,如果對程式很熟悉的,基本上在這一步就可以定位代碼段了。

對程式不熟悉,還要進一步定位。

此處線程的TID,我們需要轉化成16進制表示,下面的線程快照會用到。

以8740舉例,轉換成16進制是2224。

打開cmd,>jps,擷取程序id:

java多線程-cpu記憶體占用-定位分析

6064。

使用java的jstack明令:>jstack 6064,擷取線程快照。

(此處在指令視窗顯示,可讀性較差,可自行百度如何生成檔案)

我們尋找nid是2224的線程,找到了:

java多線程-cpu記憶體占用-定位分析

線程狀态runnable(自行百度線程的狀态),沒錯,就是他。

下文定位到了具體方法,沒錯,就是這個:

java多線程-cpu記憶體占用-定位分析

此方法執行大量io操作,高占用cpu。

測試成功。