PS:我确实知道如何正确清理,而无需依赖finalize()。
Java是否不能保证在程序退出时会进行正确的垃圾回收?
例如,可以说我将一些数据保留在缓存中,而不是经常对其进行序列化,我还实现finalize()了这样一个希望:如果由于某种原因(崩溃除外),我的程序正常退出,那么缓存将被写入数据库/文件/一些-
由我的代码存储在finalize()方法中。但是根据下面的小实验,看来JVM似乎没有“优雅地”清理内存,而是退出了。
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()被调用没有影响。