在Java中,当对象即将被垃圾回收并且不可访问时(前提是该对象覆盖了finalize
方法),会调用finalize
方法。但是如果finalizer使得对象再次可访问,那么会发生什么呢?
在Java中,当对象即将被垃圾回收并且不可访问时(前提是该对象覆盖了finalize
方法),会调用finalize
方法。但是如果finalizer使得对象再次可访问,那么会发生什么呢?
那么该对象就不会被垃圾回收,这就是所谓的对象复活。搜索一下这个术语,你应该可以找到一些有趣的文章。正如Jim提到的,一个重要的点是finalizer只会运行一次。
finalize()
方法只会被调用一次。是的,这就是为什么你不应该使用finalizers(其中之一)。
有一个引用集合被用来做这件事。我会查找并在这里发布它,但我认为它是PhantomReference。
没错,PhantomReference:
幽灵引用对象,在收集器确定其引用可能被回收后入队。 幽灵引用通常用于以比Java终结机制更灵活的方式安排临死清理操作。
由于finalize仅针对任何给定对象调用一次,因此下一次通过时,当它没有引用时,它将直接释放内存而不调用finalize。有关finalization的一些很好的信息,请单击此处。