什么时候执行finalize()?

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

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

它确保执行finalize()。 我说是

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

然而,她没有发表评论,但看起来很失望。

我解释错了吗? 提前致谢

Bruce Eckel说:

 In Java, Objects do not always get garbage collected. 

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

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

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

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

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

finalize的一般合同是, 如果 JavaTM虚拟机确定不再有任何方法可以通过任何尚未死亡的线程访问此对象,则会调用它,除非采取了一些操作通过最终确定一些其他准备完成的对象或类

永远不会保证调用Finalize方法。 请参阅何时在Java中调用finalize()方法? 对此有一个很好的总结。

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

问题的第二部分:如果使用了对象,那么它将不会被垃圾收集,因此不会调用finalize()