JVM/GC 是否在程序/线程退出时调用 'finalize()'?
PS:我确实知道如何正确清理,而无需依赖.finalize()
Java不保证在程序退出时,会进行适当的垃圾回收吗?
例如,假设我在缓存中保留了一些数据,而不是频繁地序列化它,我还实现了希望如果由于任何原因(崩溃除外)我的程序优雅地退出,那么缓存将由我的代码在finize()方法中写入DB / file / some-storage。但根据下面的小实验,JVM似乎没有“优雅地”清理内存,它只是退出。finalize()
Java规范(参见程序退出)没有说明在退出时如何处理内存/ gc。或者我应该一直在查看规范的不同部分?
以以下示例(末尾的输出)为例,在 Windows 7 上使用 1.6.0.27 64 位
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()