Java 基礎核心知識點精講:垃圾回收、異常體系與 JVM 內存模型
27. 垃圾回收(GC)目的與觸發時機
目的:識別並回收不再使用的對象,釋放與重用內存資源。
關鍵點:將引用置 null 並不會立即觸發 GC;GC 觸發時機完全由 JVM 決定,開發者不可強制控制。
28. System.gc() 與 Runtime.gc()
- 兩者本質相同,均為「建議」JVM 執行垃圾回收
- 是否立即執行、採用何種算法,完全取決於 JVM 實現
29. finalize() 方法深度解析
- 對象被 GC 回收前由 JVM 自動調用
- 不可靠性:若內存充足,GC 可能永不執行,導致
finalize() 永不被調用
- 主要用途:回收 JNI(Java Native Interface)調用 C/C++ 代碼分配的堆外內存
- 純 Java 開發中一般無需關注,內存管理由 GC 自動完成
30. Java 堆與永久代(Metaspace)
- 堆:運行時數據區,所有對象實例與數組均在此分配,由 GC 自動管理
- 對象狀態:存活對象(可達性分析可達)不會被回收;死亡對象(不可達但未回收)佔用空間直到 GC 清理
- 永久代/元空間:存儲類元數據。滿載時觸發 Full GC (Major GC)
參考:運行時數據區詳解
31. 串行收集器 vs 吞吐量收集器
- 串行收集器:單線程,適合小應用(~100MB 內存)
- 吞吐量收集器:並行新生代收集,面向中大型應用
參考:垃圾收集器對比
32. 永久代垃圾回收機制
永久代滿或達臨界值觸發 Full GC。注意:JDK 8 起永久代被元空間替換,機制有所不同。
33. 兩大異常類型:受檢查 vs 非受檢查
| 類型 | 代表 | 處理要求 | 傳播行為 |
| 受檢查異常 | IOException, SQLException | 強制 throws 聲明或 try-catch 捕獲 | 不會自動傳播 |
| 非受檢查異常 | RuntimeException, Error | 無需聲明,可選捕獲 | 自動向上傳播 |
34. Exception 與 Error 的區別
- 同為
Throwable 子類
Exception:應用層可預期、可處理的異常情況
Error:系統級嚴重問題(如 OutOfMemoryError),不建議應用捕獲
35. throw vs throws
throw:方法體內顯式拋出異常實例
throws:方法簽名聲明可能拋出的異常類型,多個用逗號分隔
36. finally 塊 vs finalize() 方法
finally:無論是否拋出異常均執行,用於資源釋放(關流、解鎖等)
finalize():Object 的 protected 方法,GC 前由 JVM 調用,用途極窄
延伸閱讀:GC 詳細機制 | GC 觸發條件分析