在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)文章
Java?EasyExcel導(dǎo)出合并單元格的示例詳解
EasyExcel是阿里巴巴開源的一個(gè)excel處理框架,以使用簡(jiǎn)單、節(jié)省內(nèi)存著稱,這篇文章主要為大家介紹了如何利用EasyExcel導(dǎo)出合并單元格,需要的可以參考下2023-09-09Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法
這篇文章主要介紹了Java使用數(shù)組實(shí)現(xiàn)ArrayList的動(dòng)態(tài)擴(kuò)容的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06SpringBoot獲取配置文件內(nèi)容的幾種方式總結(jié)
大家都知道SpringBoot獲取配置文件的方法有很多,下面這篇文章主要給大家介紹了關(guān)于SpringBoot獲取配置文件內(nèi)容的幾種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02FastDFS分布式文件系統(tǒng)環(huán)境搭建及安裝過(guò)程解析
這篇文章主要介紹了FastDFS分布式文件系統(tǒng)環(huán)境搭建及安裝過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用c:命名空間簡(jiǎn)化配置操作,結(jié)合實(shí)例形式詳細(xì)分析了Spring使用c:命名空間簡(jiǎn)化配置的相關(guān)接口與配置操作技巧,需要的朋友可以參考下2019-12-12Java零基礎(chǔ)教程之do-while循環(huán)語(yǔ)句實(shí)例
Java中的do-while循環(huán)是一種后測(cè)試循環(huán)語(yǔ)句,它類似于while循環(huán),但它先執(zhí)行循環(huán)體中的代碼,然后再進(jìn)行條件判斷,無(wú)論條件是否滿足,至少會(huì)執(zhí)行一次循環(huán)體中的代碼,這篇文章主要給大家介紹了關(guān)于Java零基礎(chǔ)教程之do-while循環(huán)語(yǔ)句的相關(guān)資料,需要的朋友可以參考下2024-09-09