GC 行為保證與代碼實踐
- 定義:回收不再使用的對象內存,供新對象分配
- 不可用判準:無任何活躍程序部分引用 (不可達)
- 運行線程:低優先級,內存不足時可能觸發,無時間保證
- 不可強制:
System.gc() 僅建議啟動,不保證執行
- 無回收保證:不可達對象可能永不被回收,finalize 可能永不執行,程序結束前內存可能不釋放 (依賴 OS)
- 無順序保證:回收順序與 finalize 調用順序均不確定
- 循環引用不阻礙回收:相互引用的孤立對象圖同樣可回收
- 手動置 null 輔助回收:
obj = null 暗示 GC,但若對象附加監聽器 (AWT 組件常見) 需先移除監聽器
- finalize() 簽名:
protected void finalize() throws Throwable,子類可擴大訪問權限、縮小異常列表
- finalize 單次調用:異常不阻礙後續回收 (由 GC 決定)
- 對象復活:finalize 中讓其他對象引用
this 可使不可達對象再次可達,但僅能發生一次 (finalize 只調用一次)
- 顯式調用 finalize 不觸發回收:僅執行方法體
- finalize 可重載:但只有原始簽名會被 GC 調用
- finalize 不自動鏈接:子類必須顯式調用
super.finalize() 作為最後動作,編譯器不強制
- System.runFinalization():運行待執行的 finalize
- 局部變量出作用域即可回收:方法退出時,局部引用消失,對象如無其他引用即可回收
- 標記-清除算法:遍歷所有引用標記可達對象,清除未標記對象
- 實踐建議:切勿依賴 finalize 釋放稀缺資源 (文件句柄、網絡連接等),無法預知調用時機
考試重點
- GC 觸發條件不確定,
System.gc() 僅建議
- finalize 只運行一次,可復活對象但僅一次
- 循環引用不阻礙 GC
- 局部變量隨方法結束可回收
- 標記-清除是基礎算法概念
理解 GC 的非確定性本質,編寫代碼時顯式管理關鍵資源 (try-with-resources、finally 關閉流),而非寄希望於 finalize。