protected void finalize() throws Throwable 是 Object 類別定義的方法,意圖在物件被垃圾回收前執行清理工作(如關閉檔案、釋放原生資源)。它與建構子相反:建構子初始化,終結子清理。
finalize()。finalize() 成功完成後,物件才在下一輪 GC中真正被回收(至少兩次 GC 週期)。finalize() 會被呼叫(程式結束、GC 不執行等情況)。finalize() 拋出未捕獲例外,終結流程中止,物件可能永不被回收。finalize() 物件會導致 Finalizer 執行緒跟不上,佇列堆積,最終觸發 OutOfMemoryError。public class ObjectWYieldFinalizer {
@Override
protected void finalize() throws Throwable {
Thread.yield(); // 讓出 CPU,Finalizer 執行緒反覆暫停
}
}
public class TestObjectWYieldFinalizer {
public static void main(String[] args) {
while (true) {
new ObjectWYieldFinalizer(); // 持續產生物件,Finalizer 來不及處理
}
}
}
執行結果:記憶體快速耗盡,拋出 java.lang.OutOfMemoryError。
AutoCloseable 的資源,編譯期保證釋放。java.lang.ref.Cleaner (JDK 9+):比 finalize() 更輕量、可控的清理機制。close()/dispose() 方法:由呼叫端負責在 finally 區塊釋放。finalize() 具備不可預測的執行時機、效能負擔、記憶體洩漏風險,不應依賴它進行關鍵資源釋放。現代 Java 開發應改用上述確定性釋放模式。