在windows下揪出java程序占用cpu很高的線程并完美解決
我的一個(gè)java程序偶爾會(huì)出現(xiàn)cpu占用很高的情況
一直不知道什么原因
今天終于抽時(shí)間解決了
系統(tǒng)是win2003
jvisualvm 和 jconsole貌似都只能看到總共占用的cpu 看不到每個(gè)線程分別占用的cpu呢所以在windows平臺(tái)上要找出到底是哪個(gè)線程占用的cpu還不那么容易,linux用top就簡(jiǎn)單多了
最后的解決方法:
1.找到j(luò)ava進(jìn)程對(duì)應(yīng)的pid。
找pid的方法是:打開任務(wù)管理器,然后點(diǎn)擊 "查看" 菜單,然后點(diǎn)擊 "選擇列",把pid勾上,然后就可以在任務(wù)管理器里面看到所有進(jìn)程的pid值了。(也可以用第三步中提到的工具直接查看)

2.然后把java進(jìn)程導(dǎo)出快照。直接運(yùn)行命令。
jstack -l 31372 > c:/31372.stack

我這里是指定把java所有的信息導(dǎo)出到c盤的31372.stack的文件里。
3.在windows下只能查看進(jìn)程的cpu占用率,要查看線程的cpu占用率要借助其他的工具,我這里用的是微軟提供的 Process Explorer v15.3
下載地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
下載完后解壓運(yùn)行

右鍵點(diǎn)擊需要查看的進(jìn)程---properties
4.然后選擇 Threads 選項(xiàng)卡,找到占用cpu的線程的tid,比如我這里是 31876 的線程

5.把pid轉(zhuǎn)換成16進(jìn)制,我這里直接用系統(tǒng)自帶的計(jì)算器轉(zhuǎn)換,置于為什么要轉(zhuǎn)換,是因?yàn)橄惹坝胘stack導(dǎo)出的信息里面線程對(duì)應(yīng)的tid是16進(jìn)制的。



最后得到的線程pid的16進(jìn)制的值為 7C84
6.在 c盤的31372.stack文件中查找 7C84

由于是我的程序已經(jīng)該過(guò)了,這里沒(méi)有異常的東西,所以這里沒(méi)有什么異常內(nèi)容。
我的問(wèn)題沒(méi)解決之前,找到到這里的內(nèi)容為:
"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)
分析了下代碼,問(wèn)題找到了。
問(wèn)題代碼為:
// 100-999的隨機(jī)數(shù)
int random = (int) (Math.random() * 1000);
while (random < 100) {
random = random * 10;
}
這樣票眼看 是沒(méi)問(wèn)題
當(dāng)時(shí)我寫這段代碼也沒(méi)注意
關(guān)鍵在于 Math.random()的取值范圍是大于0小于1 是吧?
如果Math.random() 的值為 0.00009以下... 就成死循環(huán)了...
現(xiàn)在修改為了
// 100-999的隨機(jī)數(shù) int random = new Random().nextInt(900) + 100;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
mongo分布式鎖Java實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)?lái)一篇mongo分布式鎖Java實(shí)現(xiàn)方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
javaWeb項(xiàng)目部署到阿里云服務(wù)Linux系統(tǒng)的詳細(xì)步驟
這篇文章主要介紹了javaWeb項(xiàng)目部署到阿里云服務(wù)Linux系統(tǒng),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配
這篇文章主要介紹了Spring如何基于注解顯式實(shí)現(xiàn)自動(dòng)裝配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Servlet的兩種創(chuàng)建方式(xml?注解)示例詳解
這篇文章主要為大家介紹了Servlet的兩種創(chuàng)建方式(xml?注解)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
spring?data?jpa查詢一個(gè)實(shí)體類的部分屬性方式
這篇文章主要介紹了spring?data?jpa查詢一個(gè)實(shí)體類的部分屬性方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
使用Easyexcel實(shí)現(xiàn)不同場(chǎng)景的數(shù)據(jù)導(dǎo)出功能
這篇文章主要為大家詳細(xì)介紹了如何在不同場(chǎng)景下使用Easyexcel實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03

