類載入問題
CPU 使用率飆高
- GC 頻繁?
jstat -gcutil 或 GC log 確認。是 → 跳至 GC 排查。
- 熱點執行緒:
top -H -p <pid> 找高佔用執行緒 ID → 十六進制 → jstack 對應 nid=0xHEX 定位程式碼。
- 執行緒變化快:使用自動化腳本連續
top -H + jstack 取樣,或 perf top(需核心支援)看 JIT 熱點。
- 多次 jstack 取樣:比較多次堆疊,找高頻出現的耗 CPU 方法。
CPU iowait / sy 高
- iowait:
iostat -x、pidstat -d 定位磁碟熱點,檢查 GC、日誌寫入、資料庫檔案。
- sy:系統調用過多,
strace -cp <pid> 或 perf record -g 分析內核態熱點。
記憶體問題 (OOM)
Unable to create new native thread
ps -eLf | grep java -c 統計執行緒數 vs ulimit -u。
- 調大限制或排查洩漏:BTrace 追蹤
Thread.start():
@OnMethod(clazz="java.lang.Thread", method="start")
public static void traceThreadStart() { jstack(); }
- 常見原因:
Executors.newCachedThreadPool() 無上限、核心參數 kernel.pid_max 限制(2.6.18/32 位核心預設 32768)。
Heap OOM / GC overhead limit exceeded
- 產生 Heap Dump:啟動參數
-XX:+HeapDumpOnOutOfMemoryError 或事發時 jmap -dump:format=b,file=heap.hprof <pid>。
- MAT 分析:找大物件、支配樹、GC Roots 路徑。
- 定位業務碼:MAT 只能見物件結構,需 BTrace 追蹤具體分配點(如大 ArrayList 新增處)。
實戰案例鏈接
- NoClassDefFoundError 排查案例
- 隨機字串生成導致 CPU 飆高案例
- perf 排查 CPU 詭異現象案例
- 兩個 OOM 完整排查過程分享
工具箱總結
| 場景 | 首選工具 | 輔助工具 |
| 類載入 | BTrace / -XX:+TraceClassLoading | grepcode, 反編譯 |
| CPU 高 | top -H + jstack / perf | jstat, 自動採樣腳本 |
| 記憶體/OOM | jmap + MAT | BTrace, -XX:+HeapDumpOnOutOfMemoryError |
| GC 問題 | GC log / jstat -gcutil | GCEasy, GCViewer |
| Native 記憶體 | Google PerfTools (pprof) | BTrace 追蹤 DirectBuffer/Inflater |