Java 如果终结器使对象可访问,该怎么办?

Java 如果终结器使对象可访问,该怎么办?,java,memory-management,garbage-collection,jvm,finalizer,Java,Memory Management,Garbage Collection,Jvm,Finalizer,在Java中,当对象即将被垃圾收集时,在对象上调用finalize(覆盖它),因此当对象无法访问时。但是,如果终结器使对象再次可访问,会发生什么情况呢?是的,这就是为什么不使用终结器(好吧,这是众多原因之一) 有一个参考集合是用来做这件事的。我会查一下,然后马上贴在这里,但我认为这是幻影参考 是的 幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作。如果仔细阅读API描述,您会发现终结器可以使对象再次可访问。对象在无法访问(再次

在Java中,当对象即将被垃圾收集时,在对象上调用
finalize
(覆盖它),因此当对象无法访问时。但是,如果终结器使对象再次可访问,会发生什么情况呢?

是的,这就是为什么不使用终结器(好吧,这是众多原因之一)

有一个参考集合是用来做这件事的。我会查一下,然后马上贴在这里,但我认为这是幻影参考

是的


幻象引用对象,在收集器确定其引用对象可能被回收后排队。幻象引用最常用于以比Java终结机制更灵活的方式安排死前清理操作。

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

那么对象基本上不会被垃圾收集。这叫做物体复活。搜索这个词,你会得到一堆有趣的文章。正如Jim提到的,重要的一点是,终结器只运行一次。

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


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

它实际上会执行另一个过程来检查并确保不再有对该对象的引用。由于它在第二次通过测试时会失败,因此最终无法释放对象的内存


因为finalize只对任何给定对象调用一次,所以下一次直到它没有引用时,它只会释放内存而不调用finalize。关于定稿的一些好信息

不,这是为什么不编写一个非常糟糕的终结器的原因(如果没有足够的其他原因)。实际上,终结器确实在发现对象不可访问和运行终结器之间通过根引用使对象强可访问。如果在此期间发现无法访问的对象成为对其他对象的唯一幸存引用,则在运行终结器或通过其他方式使该引用无效之前,该其他对象将不可收集。