malloc 記憶體)。System.gc()、Runtime.getRuntime().gc()),JVM 自行決定是否執行。finalize():但調用時機同樣不確定,不可依賴其釋放關鍵資源。FileInputStream fis = null;
try {
fis = new FileInputStream("./src/ManualClear.java");
// 讀取操作...
} finally {
if (fis != null) try { fis.close(); } catch (IOException ignored) {}
}
三大常見洩漏場景:
pop() 後須顯式 elements[size] = null;,否則數組持有引用阻礙 GC。WeakHashMap 或後台線程定期清理過期項。removeListener() 並確保調用。finalize()三大合適場景:
finalize 中檢測並報警。finalize() 繼承鏈陷阱與守護者模式super.finalize() 或拋異常導致父類終結方法失效class Son extends Parent {
@Override protected void finalize() throws Throwable {
System.out.println("Son finalize");
int i = 5 / 0; // 異常中斷
super.finalize(); // 永不執行
}
}
運行結果:僅打印 Son finalize,父類邏輯缺失。
class Parent2 {
private final Object finalizeGuardian = new Object() {
@Override protected void finalize() throws Throwable {
System.out.println("父類終結邏輯必執行");
}
};
}
即使子類 finalize 異常中斷,守護者對象獨立 GC 仍會執行父類邏輯。
public class FinalizeGuardian {
public static void main(String[] args) {
new Son2(); System.gc();
}
}
// 輸出:
// 父類終結邏輯必執行
// Son2 finalize start