java在linux下占用高cpu的一次錯誤排查

2021-08-18 11:04:45 字數 1245 閱讀 1902

在前兩天突然間接到反饋說伺服器很卡解決後來做乙個記錄.

以下為檢查stack與heap的部分截圖

雖然說老年代已經77%, 但是看起來還是正常的, 並沒有到要爆掉的情況

但是觀察了幾分鐘後cpu一直持續占用不下

網上查了一些api後偶然間看到"top -h -p"可以檢視某程序下的所有執行緒

執行後可以看到, 其中8個活躍執行緒都接近100%佔用率了

有執行緒就好說了, 通過api知道左邊的pid是隸屬程序下解釋為10進製的執行緒id

然後結合程序的stack資訊內的一些資訊如圖所示 nid=執行緒id位址(包含0x開頭的必然是16進製制)

隨便查乙個pid上面如13063解釋為16進製為0x3307在匯出的stack資訊內進行搜尋

結果如上圖,接下來就是去擼**了,然後看到程式是乙個特殊觸發的邏輯,會進行死迴圈,導致執行緒遲遲不釋放這樣使用者量一上來就會導致伺服器癱瘓了,但是好在是特殊邏輯,沒有同時出現,修改後提交之後再次檢視伺服器狀態一切正常了.

為了方便你也成功解決問題, 文中提到的命令:

1\"jstack pid" 為程序stack命令 

2\"jmap -heap pid" 為程序heap命令

3\"jstack -f pid" 檢視stack資訊, 該命令會掛起程序

4\"jmap -dump:format=b,file=heapdump.bin " 進行heap快照, 該命令執行期間也會掛起程序

排查Java高CPU占用原因

top命令發現某個程序占用了100 的cpu 通過ps命令,進一步確定哪個程序出了問題 再檢視執行緒占用cpu的列表 找到占用cpu最高的執行緒,檢視tid,將其轉換為16進製制格式 printf x n tid 而後檢視堆疊資訊 jstack pid grep 16進製制tid a 60這裡報錯是...

Linux下java程序占用CPU 100 排查

網上已經有老哥分享了。原文 主要是做個記錄備查 幾個命令 1.top檢視程序pid pid 37654 2.top p 37654 shift h 檢視子執行緒的pid 559 3.printf x n 559 轉成16進製制 0x22f,使用jstack的時候使用 4.jstack 37654 g...

Linux下如何檢視高CPU佔用率執行緒

在 linux 下 top 工具可以顯示 cpu 的平均利用率 user,nice,system,idle,iowait,irq,softirq,etc.可以顯示每個 cpu 的利用率。但是無法顯示每個執行緒的 cpu 利用率情況,這時就可能出現這種情況,總的 cpu 利用率中 user 或 sys...