如果终结器使对象可达,该怎么办?

在Java中,当一个对象(它会覆盖它)时会调用finalize ,当它即将被垃圾回收时,所以当它无法访问时。 但是如果终结器使对象再次可达,那么会发生什么呢?

在再次无法访问之前,不会收集该对象。

根据JavaDoc ,不会再次调用finalize()。

然后,对象基本上不会收集垃圾。 这称为物体复活 。 搜索该术语,你应该得到一堆有趣的文章。 正如吉姆所说,重要的一点是终结者只会运行一次。

如果仔细阅读API描述,您将看到终结器可以使对象再次可访问。 在无法访问(再次)之前,不会丢弃该对象,但不会多次调用finalize()

是的,这就是为什么你不使用终结器(嗯,其中一个原因)。

有一个参考集合,用于完成这些工作。 我会查找并在一秒钟内发布它,但我认为它是PhantomReference。

是的, PhantomReference :

幻影参考对象,在收集器之后排队,确定可以回收它们的对象。 幻像引用最常用于以比Java终结机制更灵活的方式调度预先清理操作。

它实际上做了另一个检查并确保没有对该对象的引用。 由于它在第二次传递时将无法通过该测试,因此最终不会释放该对象的内存。

因为对于任何给定对象,finalize只被称为一次,所以下次没有引用时,它将释放内存而不调用finalize。 关于最终确定的一些好的信息。