2

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

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

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

下一个问题是是否正在使用 Class A 的 obj,如果现在 JVM 运行 GC,它是否执行 finalize()。我说不,它不会执行这个 finalize() 因为 JVM 不收集 A 的对象。

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

我解释错了吗?提前致谢

4

4 回答 4

2

不能保证会调用类finalize()方法。

finalize 的一般约定是,JavaTM 虚拟机确定不再有任何方法可以让尚未终止的任何线程访问该对象时调用它,除非是由于所采取的操作通过对准备完成的其他对象或类的完成

于 2013-11-24T17:34:57.787 回答
0

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

于 2013-11-24T17:35:46.790 回答
0

根据布鲁斯·埃克尔的说法:

In Java, Objects do not always get garbage collected. 

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

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

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

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

于 2013-11-24T17:38:45.287 回答
0

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

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

于 2013-11-24T17:38:51.760 回答