【发布时间】:2015-10-27 05:39:26
【问题描述】:
引自 SCJP 6 学习指南:
在
finalize()方法中,您可以编写传递引用的代码 将有问题的对象返回到另一个对象,从而有效地取消了该对象的垃圾收集资格。如果稍后同一对象再次符合垃圾收集条件,垃圾收集器仍然可以处理该对象并将其删除。然而,垃圾收集器会记住,对于这个对象,finalize()已经运行,它不会再次运行finalize()
为什么会这样设计?即使对象第二次被标记为收集,finalize() 方法的目的仍然有效。那么为什么 Java 决定跳过对 finalize() 的调用呢?
【问题讨论】:
-
那句话出自哪里?
-
因为垃圾回收假定 finalize() 不应该使对象不符合 GC 条件。如果是这样,这是一个错误,你应该修复它。无论如何,这很有趣,但在 18 年的 Java 编程中,我认为我从未使用过 finalize()。正确的代码不需要它。
-
@JBNizet 我也在想同样的事情,但是the Javadocs 没有指定那个合约,而是提到“finalize 方法可以采取任何行动,包括让这个对象再次对其他线程可用” (在这不是
finalize的常用用法的上下文中,但它仍然是一个选项)。 -
@Vulcan 嗯,很有趣。那么我会说,如果您使对象不合格,那可能是一个错误,如果不是,那么您就靠自己了,应该足够聪明,可以再次调用 finalize( ) 不必要的。我的主要观点是:在 99.9999% 的情况下,finalize() 是无用的。在您使用它的 99.9999% 的情况下,您不应该使对象不适合其中的 GC。
-
@JBNizet 你可能对“物体复活”这个词感兴趣。
标签: java garbage-collection finalize