什么时候执行finalize()?

时间:2013-11-24 17:31:33

标签: java jvm finalizer finalize

在一次采访中我被问到,假设当A类对象未被使用时JVM运行gc。

class A{
//some code here
protected void finalize(){
//code here
}
}

是否保证执行finalize()。我说是的

接下来的问题是,如果正在使用类A的obj,如果现在JVM运行GC它会执行finalize()。我说不,它不会执行此finalize(),因为JVM不会收集A的对象。

然而,她没有评论任何事情,但看起来很失望。

我解释错了吗?在此先感谢

4 个答案:

答案 0 :(得分:2)

无法保证将调用类finalize()方法。

  

finalize的一般合同是,如果,当 JavaTM虚拟机已经确定不再有任何方法可以通过任何尚未被任何线程访问的对象时调用死亡,除非最终确定其他一些准备最终确定的对象或类别所采取的行动

答案 1 :(得分:0)

永远不会保证调用Finalize方法。有关此问题的详细摘要,请参阅When is the finalize() method called in Java?

答案 2 :(得分:0)

布鲁斯·埃克尔说:

In Java, Objects do not always get garbage collected. 

通常意味着,即使您声明了finalize()方法,也可能永远不会调用它。在这种情况下,您的清理例程将永远不会执行。这完全取决于JVM GC。 即使GC可能运行,它也可能无法收集给定的对象。只要尚未收集的Object(仍未被引用),其finalize()永远不会被调用。

此外,在程序终止之前,可能根本不会调用垃圾收集。在这种情况下,内存作为一个整体返回到操作系统,没有任何GC。并且没有任何最终方法调用。

所以,你的第一个问题的答案是

你的第二个答案是对的。如果对象仍在使用中,无论GC是否运行,都无法收集(并且finalize()被调用),除非您使用WeakReference或类似的东西。

答案 3 :(得分:0)

无法保证会调用finalize()方法。此外,您可以通过在finalize()方法中为其分配链接来“恢复”组件,它将阻止垃圾回收。有趣的是,永远不会再为这个对象调用finalize(),即使它是垃圾收集的。

问题的第二部分:如果使用该对象,则不会进行垃圾回收,因此不会调用finalize()