首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 線上問題排查實戰手冊:CPU、記憶體、類載入、GC

     編輯:Java 相關知識

類載入問題

  • ClassNotFoundException / NoClassDefFoundError:
    1. 確認類應載入路徑(WEB-INF/lib/classes),用 jar -tvf 檢查 JAR 內容。
    2. 日誌有堆疊 → 定位 ClassLoader 實現 → grepcode.com 或反編譯查載入邏輯。
    3. 無堆疊 → BTrace 追蹤拋出異常處堆疊:
    @BTrace public class Trace {
        @OnMethod(clazz="java.lang.ClassNotFoundException", method="")
        public static void trace() { jstack(); }
    }
    
  • NoSuchMethodException:版本衝突。啟動加 -XX:+TraceClassLoading 觀察載入來源,jar -tvf 核對版本,排除衝突 JAR。

CPU 使用率飆高

  1. GC 頻繁? jstat -gcutil 或 GC log 確認。是 → 跳至 GC 排查。
  2. 熱點執行緒:top -H -p <pid> 找高佔用執行緒 ID → 十六進制 → jstack 對應 nid=0xHEX 定位程式碼。
  3. 執行緒變化快:使用自動化腳本連續 top -H + jstack 取樣,或 perf top(需核心支援)看 JIT 熱點。
  4. 多次 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

  1. 產生 Heap Dump:啟動參數 -XX:+HeapDumpOnOutOfMemoryError 或事發時 jmap -dump:format=b,file=heap.hprof <pid>。
  2. MAT 分析:找大物件、支配樹、GC Roots 路徑。
  3. 定位業務碼:MAT 只能見物件結構,需 BTrace 追蹤具體分配點(如大 ArrayList 新增處)。

實戰案例鏈接

  • NoClassDefFoundError 排查案例
  • 隨機字串生成導致 CPU 飆高案例
  • perf 排查 CPU 詭異現象案例
  • 兩個 OOM 完整排查過程分享

工具箱總結

場景首選工具輔助工具
類載入BTrace / -XX:+TraceClassLoadinggrepcode, 反編譯
CPU 高top -H + jstack / perfjstat, 自動採樣腳本
記憶體/OOMjmap + MATBTrace, -XX:+HeapDumpOnOutOfMemoryError
GC 問題GC log / jstat -gcutilGCEasy, GCViewer
Native 記憶體Google PerfTools (pprof)BTrace 追蹤 DirectBuffer/Inflater
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved