6

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

4

5 回答 5

10

然后该对象基本上不会被垃圾收集。这称为对象复活。搜索那个词,你应该会得到一堆有趣的文章。正如 Jim 所提到的,重要的一点是终结器只会运行一次。

于 2010-09-27T21:43:58.797 回答
9

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

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

于 2010-09-27T21:44:07.643 回答
7

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

于 2010-09-27T21:43:51.637 回答
3

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

有一个参考集合可以做这些事情。稍后我会查找并在此处发布,但我认为它是 PhantomReference。

是的,幻影参考

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

于 2010-09-27T21:43:09.167 回答
3

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

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

于 2010-09-27T21:49:42.847 回答