前言
害。。。
昨天剛寫完一份關(guān)于jvm問題排查相關(guān)的博客,今天線上項目就遇到了一個突發(fā)問題。
現(xiàn)象是用戶反映系統(tǒng)非常卡,無法操作。
然后登錄服務(wù)器查看發(fā)現(xiàn)cpu 一直100%以上。
具體排查步驟:
1,首先top命令查看服務(wù)器cpu等情況:
發(fā)現(xiàn)線上pid 29737的 java應(yīng)用cpu達到100%

2,top -H -p pid命令查看具體的線程情況
top -H -p 29373
輸入上述命令,然后按H顯示cpu最高排名的線程??梢钥吹絧id 30013的線程cpu 100%且一直未釋放。

3.將線程的pid轉(zhuǎn)為16進制
printf "%x\n" 30013

30013做16進制轉(zhuǎn)換為753d
4.使用jvm工具jstack打印該進程的堆棧信息
使用該命令打印堆棧信息的后50行
jstack 29737 |grep -A 50 753d

然后就可以具體看到具體的出問題的是哪部分代碼了,然后檢查更改即可。(我們的是代碼中出現(xiàn)死循環(huán))
注意問題:
可能會出現(xiàn)以下報錯:
xxxx: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding
有兩個可能:
jstack后面的進程pid不對,或者16進制的數(shù)不對。
需要注意jstack后面是jps的java進程id。
2.執(zhí)行該命令的用戶必須和java應(yīng)用所屬的用戶一致。
常見的cpu飆升原因
程序中存在死循環(huán)或者長時間占用 CPU 的操作。比如,不合理的遞歸操作、循環(huán)操作等等。
程序中存在大量的計算操作,例如復(fù)雜的算法、大量的數(shù)值計算等等。
程序中存在大量的 IO 操作,例如讀寫文件、網(wǎng)絡(luò)通信等等。
程序中存在大量的線程創(chuàng)建和銷毀操作,以及線程間的競爭和同步操作。
程序中存在內(nèi)存泄漏或者內(nèi)存溢出,導(dǎo)致 JVM 不斷進行垃圾回收。
程序中存在大量的數(shù)據(jù)庫操作,導(dǎo)致數(shù)據(jù)庫連接池的耗盡和數(shù)據(jù)庫負載過高。文章來源:http://www.zghlxwxcb.cn/news/detail-425300.html
針對這些問題,需要具體情況具體分析,采取相應(yīng)的優(yōu)化措施,例如修改代碼邏輯、優(yōu)化算法、降低 IO 操作頻率、減少線程創(chuàng)建和銷毀、增加 JVM 內(nèi)存等等。文章來源地址http://www.zghlxwxcb.cn/news/detail-425300.html
到了這里,關(guān)于java 應(yīng)用cpu飆升(超過100%)故障排查的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!