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()
是否被称为没有任何影响。
你的问题是程序可能在任何时候都不正常地死去。您可能还需要能够在重新启动时进行清理。 –