記一次java程序CPU占用過高問題排查
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進!你不來,我和你的競爭對手一起精進!
編輯:業(yè)余草
puhaiyang.blog.csdn.net
推薦:https://www.xttblog.com/?p=5349
問題是這樣的,將項目部署到服務(wù)器上后,發(fā)現(xiàn)應(yīng)用程序的響應(yīng)速度非常慢,于是開始進行了排查。
TOP
首先查看系統(tǒng)資源占用信息,TOP看一下

發(fā)現(xiàn)正在運行的JAVA項目CPU占用率很高,百分之200左右了,那么問題一定出在這個程序中
Ps -mp pid -o THREAD,tid,time
再通過ps命令查看這個程序的線程信息,tid代碼線程ID,time代表這個線程的已運行時間
由上面TOP可知進程ID為15669


于是可以看到這個進程中有3個線程的CPU占用率很高,并且它們目前也運行了13分鐘了,它們的TID分別為16068,16069,16071
進制轉(zhuǎn)換,2HEX
再將這3個TID轉(zhuǎn)為16進制,為等會在jstack中查找方便
Printf “%x\\n” number

得到這三個數(shù)的16進制為別為3ec4,3ec5,3ec7
jstack查看進程信息
有了線程ID的16進制后,再在jstack中查看進程堆棧信息(之所有拿到TID信息,主要是為了查找方便)
通過jstack -pid 再grep查詢

從這里能看出,這3個線程目前還處于運行狀態(tài)的
再通過jstack查看詳細點的信息


其中顯示出了較為詳細的代碼信息。
本地代碼問題排查
再通過回到代碼中查看getRemovedDateTypeParam方法。

仔細看了代碼后,才發(fā)現(xiàn)了問題;此處的代碼問題在于:如果paramMap不為空,但dateParamMap為空的,那么程序就會出現(xiàn)死循環(huán)。真是一個大BUG啊!
開發(fā)時大意了,沒考慮到。
然后修改為以下代碼:

再測試下,打包上傳后,程序終于正常了!
如果以后遇到類似的問題可以先按照上面這種思路進行查看:
通過「jps -v」找到對應(yīng)的pid
導(dǎo)出進程stack信息:
jstack -l [pid] >> [文件名]
// jstack -l 123456 >> 123.txt**打開導(dǎo)出的jstack文件進行查看,如果內(nèi)容過多,也可以先通過一些jstack分析工具進行查看。
