從 JDK 基礎例外到 JVM 記憶體調優,覆蓋空指針、集合遍歷、執行緒安全、BigDecimal 精度等高頻問題,每條都經過社區驗證。
編譯錯誤、字節碼、註解處理、VerifyError
類加載、NoSuchMethod、jar 衝突、Native 庫加載
編譯能過、運行卻拋 NoSuchMethodError,九成是編譯期與運行期的依賴版本不一致。
System.loadLibrary 報 UnsatisfiedLinkError,多是庫不在 java.library.path、庫名或架構不匹配。
ClassNotFoundException 多因 classpath 缺依賴;NoClassDefFoundError 常因靜態初始化失敗。
Metaspace 存類元數據且走本地記憶體,報錯多是動態生成類過多或 ClassLoader 洩漏、舊類卸載不掉。
OOM、GC 調優、記憶體洩漏、棧溢出
堆還沒滿就 OOM,因為直接記憶體不在堆裡、GC 管不到,多是 Netty 等 NIO 緩衝沒釋放或沒設上限。
不是堆真不夠,而是 GC 花了超 98% 的時間卻只回收不到 2%,根子還是堆小或存在洩漏。
Metaspace 存類元數據且走本地記憶體,報錯多是動態生成類過多或 ClassLoader 洩漏、舊類卸載不掉。
堆被物件佔滿、GC 回收不回空間時拋出,用 -XX:+HeapDumpOnOutOfMemoryError 留快照,調大 -Xmx 只是治標。
不是堆記憶體不夠,是遞歸或調用鏈太深把執行緒棧頂穿;先查遞歸出口,-Xss 調大隻是應急。
ThreadLocal 在執行緒池裡用完不 remove 會累積無主 value,最終把堆吃滿拋出 OutOfMemoryError。
死鎖、執行緒安全、併發集合、執行緒池
SimpleDateFormat 內部共享 Calendar,定義成靜態變數後併發會報 NumberFormatException 或日期串臺。
它不只在多執行緒出現,單執行緒遍歷時直接增刪元素一樣觸發;改用 removeIf 或 Iterator.remove 即可。
死鎖不是例外,是執行緒各握對方要的鎖互相永久等待;用 jstack 能直接打出環上執行緒。
ThreadLocal 在執行緒池裡用完不 remove 會累積無主 value,最終把堆吃滿拋出 OutOfMemoryError。
不是堆滿,是操作系統拒絕再創建執行緒:ulimit -u 或 kernel.threads-max 到頂,或執行緒棧吃光 native 記憶體。
NPE、InvocationTarget、反射
文件/Socket、NIO、編碼、序列化
集合遍歷、BigDecimal、日期時間、Stream
JNI、java.library.path、JVM 參數、ulimit
報 IOException: Too many open files 是 Linux 文件描述符上限被擊穿,多半是 FD 洩漏或 ulimit 沒生效。
System.loadLibrary 報 UnsatisfiedLinkError,多是庫不在 java.library.path、庫名或架構不匹配。
不是堆滿,是操作系統拒絕再創建執行緒:ulimit -u 或 kernel.threads-max 到頂,或執行緒棧吃光 native 記憶體。