Java和手动执行finalize
时间:2020-03-05 18:43:29 来源:igfitidea点击:
如果我从程序代码中的某个对象上调用finalize()
,那么当垃圾回收器处理该对象时,JVM是否仍会再次运行该方法?
这是一个大概的例子:
MyObject m = new MyObject(); m.finalize(); m = null; System.gc()
对finalize()的显式调用是否会使JVM的垃圾回收器不对对象m运行finalize()方法?
解决方案
回答
JVM对于任何给定对象都不会多次调用finalize方法。无论如何,我们都不应依赖finalize,因为不能保证会调用它。如果由于需要执行清理代码而调用finalize,则最好将其放入一个单独的方法中并使其明确,例如:
public void cleanUp() { . . . } myInstance.cleanUp();
回答
根据这个简单的测试程序,即使我们显式调用了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"); }
输出为:
start finalizing! finalizing! done
那里的每个资源都说永远不要显式地调用finalize(),甚至几乎永远都不会实现该方法,因为无法保证何时以及何时调用它。最好只手动关闭所有资源。