如果我从程序代码中的某个对象上调用finalize()
,那么当垃圾回收器处理该对象时, JVM 仍会再次运行该方法吗?
这是一个大概的例子:
MyObject m = new MyObject();
m.finalize();
m = null;
System.gc()
对
finalize()
的显式调用是否会使 JVM 的垃圾回收器不对对象finalize()
运行m
方法? 最佳答案
根据这个简单的测试程序,即使您显式调用了JVM,JVM仍将对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(),甚至几乎永远都不会实现该方法,因为无法保证何时以及何时调用它。最好只手动关闭所有资源。
关于java - Java和手动执行finalize,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28832/