一,建立測試環境(windows)
二,定位
正文:
測試環境如下:
建立2個線程類,一個run死循環執行大量io,另一個run死循環執行1秒睡眠。main方法開啟4線程,上述每個開啟2個。
高占用如下:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2QvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39zNxQzMxEDMyEDOwMDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
下載下傳process explorer可檢視程序的詳細資訊:
可看出,java程序裡2個線程高占用cpu。
現在大概定位問題了,如果對程式很熟悉的,基本上在這一步就可以定位代碼段了。
對程式不熟悉,還要進一步定位。
此處線程的TID,我們需要轉化成16進制表示,下面的線程快照會用到。
以8740舉例,轉換成16進制是2224。
打開cmd,>jps,擷取程序id:
6064。
使用java的jstack明令:>jstack 6064,擷取線程快照。
(此處在指令視窗顯示,可讀性較差,可自行百度如何生成檔案)
我們尋找nid是2224的線程,找到了:
線程狀态runnable(自行百度線程的狀态),沒錯,就是他。
下文定位到了具體方法,沒錯,就是這個:
此方法執行大量io操作,高占用cpu。