面對 Java 進程 CPU 飆高或 I/O 等待過久,如何快速定位到具體程式碼行?本文實戰演示 ps、top、mpstat 三大監控指令的組合拳,從進程到線程,再到 JVM 堆棧,層層剝洋蔥找出效能瓶頸根因。

ps -mp -o THREAD,tid,time
# 或
ps -Lfp
關鍵欄位:TID (線程 ID)、TIME (佔用 CPU 時間)。找出 TIME 最大的 TID,例如 30834。
printf "%x\n" 30834
# 輸出如 789b
jstack > jstack.log
grep -i 789b jstack.log
即可定位到對應的 Java 線程堆棧,直達問題程式碼區塊。

nid=0x7d9b:對應 Linux 系統的線程 ID (即十六進制 TID)tid=0x00002aab047a9800:JVM 內部記憶體地址,進階記憶體分析用daemon prio=10:守護線程、優先級waiting on condition:線程狀態 (等待、運行、阻塞等)若需動態觀察,使用 top 的線程模式:
top -Hp
畫面會即時刷新各線程 CPU%、記憶體佔用,配合上述 jstack 分析流程同樣適用。

mpstat -P ALL 1 1000
重點關注 %iowait 欄位:
%iowait 持續偏高 (如 > 20-30%),通常意味著磁碟 I/O 成為瓶頸。iostat -x 1、pidstat -d 1 進一步定位具備裝置與進程。
掌握這套「進程→線程→堆棧」鏈路,配合 JVM 參數調優、程式碼優化、資料庫索引優化,即可系統性解決 Linux 伺服器效能疑難雜症。