PS:我确实知道如何正确清除,而不依赖于finalize()
。
Java不能保证在程序退出时进行垃圾回收吗?例如,假设我将一些数据存储在缓存中,而不是频繁地对其进行序列化。我还使用了finalize()
,希望如果我的程序正常退出(除了崩溃以外的任何原因),那么缓存将通过finalize()
方法被写入到数据库/文件/某些存储中。但是根据以下小实验,似乎JVM并没有“优雅地”清理内存,它只是退出。 Java规范(请参见程序退出)没有说明有关退出时如何处理内存/ 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()
。