天天看點

windows下CPU占用過高(查詢占用CPU高的代碼)

在windows平台上要找出到底是哪個線程占用的cpu還不那麼容易,linux用top就簡單多了最後的解決方法

1、找到java程序對應的pid

找pid的方法是:打開任務管理器,然後點選 "檢視" 菜單,然後點選 "選擇列",把pid勾上,然後就可以在任務管理器裡面看到所有程序的pid值了。(也可以用第三步中提到的工具直接檢視)

windows下CPU占用過高(查詢占用CPU高的代碼)

2、把java程序導出快照,直接運作指令

2.1、jstack -l 31372 > c:/31372.stack

windows下CPU占用過高(查詢占用CPU高的代碼)

指定把java所有的資訊導出到c盤的31372.stack的檔案裡。

3、.在windows下隻能檢視程序的cpu占用率,要檢視線程的cpu占用率要借助其他的工具,我這裡用的是微軟提供的 Process Explorer v15.3

工具下載下傳位址杩涚▼璧勬簮绠$悊鍣� - Sysinternals | Microsoft Learn

下載下傳完後解壓運作

windows下CPU占用過高(查詢占用CPU高的代碼)

右鍵點選需要檢視的程序---properties

4、然後選擇 Threads 頁籤,找到占用cpu的線程的tid,比如我這裡是 31876 的線程

windows下CPU占用過高(查詢占用CPU高的代碼)

5、把pid轉換成16進制,我這裡直接用系統自帶的電腦轉換,為什麼要轉換,是因為先前用jstack導出的資訊裡面線程對應的tid是16進制的。

windows下CPU占用過高(查詢占用CPU高的代碼)
windows下CPU占用過高(查詢占用CPU高的代碼)
windows下CPU占用過高(查詢占用CPU高的代碼)

最後得到的線程pid的16進制的值為 7C84

6、在 c盤的31372.stack檔案中查找 7C84

windows下CPU占用過高(查詢占用CPU高的代碼)

由于是我的程式已經修改過了,是以這裡沒有什麼異常内容。

我的問題沒解決之前,找到到這裡的内容為:

"Thread-23" prio=6 tid=0x03072400 nid=0x1b68 runnable [0x0372f000]

java.lang.Thread.State: RUNNABLE

at com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)

at com.horn.common.OrderUtil.hisExp(OrderUtil.java:228)

at com.horn.util.MsgManage.receiveMsg(MsgManage.java:961)

at com.horn.util.PollMessageThread.run(PollMessageThread.java:74)

Locked ownable synchronizers:

- None           

于是 打開 t com.horn.util.MyEncrypt.encode(MyEncrypt.java:17)

分析了下代碼,問題找到了。

問題代碼為:

// 100-999的随機數

int random = (int) (Math.random() * 1000);

while (random < 100) {

random = random * 10;

}           

咋一看是沒問題當時我寫這段代碼也沒注意關鍵在于 Math.random()的取值範圍是大于0小于1 是吧?如果Math.random() 的值為 0.00009以下

就成死循環了

現在修改為

1. // 100-999的随機數  
2. int random = new Random().nextInt(900) + 100;            

問題解決。

繼續閱讀