如果我从程序代码中调用一个对象的finalize()
方法,当垃圾收集器处理该对象时,JVM是否仍会再次运行这个方法?
以下是一个近似的例子:
MyObject m = new MyObject();
m.finalize();
m = null;
System.gc()
明确调用finalize()
方法会使得JVM的垃圾回收器不运行对象m
的finalize()
方法吗?
如果我从程序代码中调用一个对象的finalize()
方法,当垃圾收集器处理该对象时,JVM是否仍会再次运行这个方法?
以下是一个近似的例子:
MyObject m = new MyObject();
m.finalize();
m = null;
System.gc()
明确调用finalize()
方法会使得JVM的垃圾回收器不运行对象m
的finalize()
方法吗?
private static class Blah
{
public void finalize() { System.out.println("finalizing!"); }
}
private static void f() throws Throwable
{
Blah blah = new Blah();
blah.finalize();
}
public static void main(String[] args) throws Throwable
{
System.out.println("start");
f();
System.gc();
System.out.println("done");
}
每个资源都建议不要显式调用finalize()方法,而且通常甚至不要实现该方法,因为无法保证它何时会被调用。最好手动关闭所有资源。开始
正在终止!
正在终止!
完成
对于任何给定的对象,finalize方法在JVM中只会被调用一次。无论如何,您都不应该依赖finalize,因为不能保证它将被调用。如果您正在调用finalize,因为您需要执行清理代码,则最好将其放入单独的方法中并使其明确,例如:
public void cleanUp() {
.
.
.
}
myInstance.cleanUp();