如果我finalize()从程序代码中调用一个对象,那么当垃圾回收器处理该对象时, JVM是否 还会再次运行该方法?
finalize()
这是一个大概的例子:
MyObject m = new MyObject(); m.finalize(); m = null; System.gc()
是否要显式调用以finalize()使 JVM 的垃圾回收器不对finalize()对象运行该方法m?
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(),甚至几乎永远都不会实现该方法,因为无法保证何时以及何时调用它。最好只手动关闭所有资源。