目錄
- 問題描述
- 問題排查
- 問題解決
- 參考資料
問題描述
業主單位服務器自8月29日晚上21:00起CPU突然飆高至98%,內存爆滿,一直到9月5日:
問題排查
①執行
top
命令查看Java進程PID
top
②執行
top -Hp PID
命令查看具體的線程情況
top -Hp 3058
輸入上述命令會顯示進程 ID 為 3058 的進程及其所有子進程的資源使用情況,按占用cpu使用率倒序顯示
上述占用CPU最高的前十線程如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 47496 root 20 0 18.6g 10.7g 15376 R 61.9 68.6 406:54.77 Thread-240 10017 root 20 0 18.6g 10.7g 15376 R 49.3 68.6 293:56.47 Thread-246 10391 root 20 0 18.6g 10.7g 15376 R 48.0 68.6 293:37.96 Thread-249 10141 root 20 0 18.6g 10.7g 15376 R 46.0 68.6 293:45.48 Thread-247 10259 root 20 0 18.6g 10.7g 15376 R 44.7 68.6 293:57.29 Thread-248 9965 root 20 0 18.6g 10.7g 15376 R 42.1 68.6 294:10.26 Thread-245 3060 root 20 0 18.6g 10.7g 15376 S 16.2 68.6 103:36.83 GC task thread# 3061 root 20 0 18.6g 10.7g 15376 S 15.9 68.6 103:36.20 GC task thread# 3063 root 20 0 18.6g 10.7g 15376 S 15.9 68.6 103:33.17 GC task thread# 3062 root 20 0 18.6g 10.7g 15376 S 15.6 68.6 103:38.85 GC task thread# 3064 root 20 0 18.6g 10.7g 15376 S 4.3 68.6 32:01.71 VM Thread
③將線程的pid轉為16進制
printf '0x%x\n' PID
④使用jvm工具jstack打印該進程的堆棧信息
jstack 47496 | grep -A 50 0xb988
But 報錯了
47496: Unable to open socket file /proc/47496/root/tmp/.java_pid47496: target process 47496 doesn't respond within 10500ms or HotSpot VM not loaded
查閱相關資料
注意:發現本地執行命令的用戶和Java應用所屬的用戶均一致,jstack后面的pid與16進制的數也是一致的,因為是直接復制過去的,若無法解決,可直接執行第⑤步
⑤執行jstack命令抓取Java線程的堆棧信息
jstack 3058 > /opt/xxxxx/thread_dump.txt
上述命令會將進程 ID 為 3058 的 Java 應用程序生成一個線程堆棧轉儲(thread dump),并將輸出重定向到 /opt/xxxxx/thread_dump.txt 文件中
⑥抓取thread_dump.txt文件至本地分析,以子線程Thread-240分析【0xb988】
⑦使用反編譯工具JD-GUI查看對應class文件
官方下載鏈接:http://java-decompiler.github.io/
成功定位到問題,進行相關代碼修改后打包部署!!!
問題解決
近3日服務器運行狀況如下:
可以看到CPU使用率基本穩定在10%,解決Java程序OOM 成功!!!
參考資料
- java應用cpu飆升(超過100%)故障排查步驟
- 重點問題!CPU利用率過高排查思路|原創