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

时间:2010-09-27 21:37:28

标签: java memory-management garbage-collection jvm finalizer

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

5 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:3)

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

有一个参考集合可以用来做这些事情。我会查看并在一秒钟内发布,但我认为这是PhantomReference。

是的,PhantomReference

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

答案 4 :(得分:3)

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

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