在windows平台上要找出到底是哪個線程占用的cpu還不那麼容易,linux用top就簡單多了最後的解決方法
1、找到java程序對應的pid
找pid的方法是:打開任務管理器,然後點選 "檢視" 菜單,然後點選 "選擇列",把pid勾上,然後就可以在任務管理器裡面看到所有程序的pid值了。(也可以用第三步中提到的工具直接檢視)
2、把java程序導出快照,直接運作指令
2.1、jstack -l 31372 > c:/31372.stack
指定把java所有的資訊導出到c盤的31372.stack的檔案裡。
3、.在windows下隻能檢視程序的cpu占用率,要檢視線程的cpu占用率要借助其他的工具,我這裡用的是微軟提供的 Process Explorer v15.3
工具下載下傳位址杩涚▼璧勬簮绠$悊鍣� - Sysinternals | Microsoft Learn
下載下傳完後解壓運作
右鍵點選需要檢視的程序---properties
4、然後選擇 Threads 頁籤,找到占用cpu的線程的tid,比如我這裡是 31876 的線程
5、把pid轉換成16進制,我這裡直接用系統自帶的電腦轉換,為什麼要轉換,是因為先前用jstack導出的資訊裡面線程對應的tid是16進制的。
最後得到的線程pid的16進制的值為 7C84
6、在 c盤的31372.stack檔案中查找 7C84
由于是我的程式已經修改過了,是以這裡沒有什麼異常内容。
我的問題沒解決之前,找到到這裡的内容為:
"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;
問題解決。