2010-09-27 33 views

回答

9

该对象不会被收集,直到它再次无法到达。

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

3

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

有一个参考集合是做这个东西。我会查找它并在一秒内发布,但我认为它是PhantomReference。

没错,PhantomReference

幻影参考对象,其集电极之后排队确定其指示可以以其它方式回收。幻影引用最常用于以比Java最终化机制更灵活的方式安排验尸前清理操作。

+0

不,这是为什么不写一个非常糟糕的finaliser(如果没有足够的其他原因)。 – 2010-09-29 00:14:40

7

如果仔细阅读API说明,您会看到终结器可以使对象再次可达。该对象不会被丢弃,直到它不可用(再次),但finalize()将不会被调用多次。

+0

实际上,终结器*通过在发现对象无法访问的时间与运行终结器的时间之间的根引用,可以强制实现对象的可达性。如果在那段时间被发现无法访问的对象成为对某个其他对象的唯一存活引用,那么在终结器运行或该引用通过其他方式失效后,该另一个对象将不可收集。 – supercat 2013-02-26 01:07:41

10

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

3

它实际上做了另一次检查并确保没有更多的对象引用。由于它的第二遍测试会失败,所以最终不会释放对象的内存。

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

相关问题