PS:我知道如何正確清理,而不依賴於finalize()
。JVM/GC是否在程序/線程退出時調用`finalize()`?
Java不能保證程序退出時,垃圾回收會被正確執行嗎?
E.g.可以說我已經將一些數據保存在緩存中,而不是頻繁地序列化,我還實現了finalize()
,希望如果由於任何原因(崩潰除外),我的程序將優雅地退出,那麼緩存將寫入DB /文件/某些我的代碼在finalize()方法中存儲。但根據以下的小實驗,似乎JVM並沒有「優雅地」清理內存,它只是退出。
Java spec(見程序退出)什麼都不說ABT內存/ GC是如何退出處理。或者我應該看看規範的不同部分?
採取使用1.6.0.27 64位下面的例子中(在端輸出),在Windows 7
public class Main {
// just so GC might feel there is something to free..
private int[] intarr = new int[10000];
public static void main(String[] args) {
System.out.println("entry");
Main m = new Main();
m.foo();
m = new Main();
// System.gc();
m.foo();
m = null;
// System.gc();
System.out.println("before System.exit(0);");
System.exit(0);
}
@Override
protected void finalize() throws Throwable {
System.out.println("finalize()");
super.finalize();
}
public void foo() { System.out.println("foo()"); }
}
/*
* Prints:
* entry
* foo()
* foo()
* before System.exit(0);
*/
變化:
- 如果我去掉任一項
System.gc()
則沒有finalize()
被稱爲。 - 如果我取消兩個
System.gc()
的註釋,則finalize()
被調用兩次。 - 無論
System.exit()
被稱爲與否對finalize()
是否被稱爲沒有任何影響。
你的問題是程序可能在任何時候都不正常地死去。您可能還需要能夠在重新啓動時進行清理。 –