近期發(fā)現(xiàn)服務(wù)器Java進(jìn)程負(fù)載,超過100%
一、采用top命令定位進(jìn)程
登錄服務(wù)器,執(zhí)行top命令,查看CPU占用情況,找到進(jìn)程的pid

很容易發(fā)現(xiàn),PID為29706的java進(jìn)程的CPU飆升到700%多,且一直降不下來,很顯然出現(xiàn)了問題。
二、使用top -Hp命令定位線程
使用 top -Hp <pid> 命令(為Java進(jìn)程的id號)查看該Java進(jìn)程內(nèi)所有線程的資源占用情況
top -Hp 29706

很容易發(fā)現(xiàn),多個線程的CPU占用達(dá)到了90%多。我們挑選線程號為30309的線程繼續(xù)分析。
三、使用jstack命令定位代碼
1.線程號轉(zhuǎn)換為16進(jìn)制
printf “%x\n” 命令(tid指線程的id號)將以上10進(jìn)制的線程號轉(zhuǎn)換為16進(jìn)制:
printf "%x\n" 30309

轉(zhuǎn)換后的結(jié)果分別為7665,由于導(dǎo)出的線程快照中線程的nid是16進(jìn)制的,而16進(jìn)制以0x開頭,所以對應(yīng)的16進(jìn)制的線程號nid為0x7665
2.采用jstack命令導(dǎo)出線程快照
通過使用dk自帶命令jstack獲取該java進(jìn)程的線程快照并輸入到文件中: jstack -l > ./jstack_result.txt 命令(為Java進(jìn)程的id號)來獲取線程快照結(jié)果并輸入到指定文件。
jstack -l 29706 > ./jstack_result.txt
3.根據(jù)線程號定位具體代碼
在jstack_result.txt 文件中根據(jù)線程好nid搜索對應(yīng)的線程描述
cat jstack_result.txt |grep -A 100 7665

根據(jù)搜索結(jié)果,判斷應(yīng)該是ImageConverter.run()方法中的代碼出現(xiàn)問題
也可以直接采用jstack <pid> |grep -A 200 <nid>來定位具體代碼
jstack 29706 |grep -A 200 7665
"System Clock" #28 daemon prio=5 os_prio=0 tid=0x00007efc19e8e800 nid=0xae24 waiting on condition [0x00007efbe0d91000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrentC.TimeUnit.sleep(TimeUnit.java:386)
at com.*.order.Controller.OrderController.detail(OrderController.java:37) //業(yè)務(wù)代碼阻塞點(diǎn)
4.總結(jié)
CPU飆升問題定位的一般步驟是:
1.首先通過top指令查看當(dāng)前占用CPU較高的進(jìn)程PID;
2.查看當(dāng)前進(jìn)程消耗資源的線程PID: top -Hp PID
3.通過print命令將線程PID轉(zhuǎn)為16進(jìn)制,根據(jù)該16進(jìn)制值去打印的堆棧日志內(nèi)查詢,查看該線程所駐留的方法位置。
4.通過jstack命令,查看棧信息,定位到線程對應(yīng)的具體代碼。文章來源:http://www.zghlxwxcb.cn/news/detail-629698.html
5.分析代碼解決問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-629698.html
到了這里,關(guān)于Java進(jìn)程CPU高負(fù)載排查步驟的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!