在finalize期间引用对象

Nat*_*ath 19 java garbage-collection finalizer

如果在finalize调用期间保存对当前对象的引用会发生什么?例如:

class foo {
    ...
    public void finalize() {
        bar.REFERENCE = this;
    }
}
Run Code Online (Sandbox Code Playgroud)

对象是否被垃圾收集?当您稍后尝试访问时会发生什么bar.REFERENCE

alb*_*ein 13

该对象不是垃圾回收.这被称为"物体复活".

你必须小心,一旦调用终结器,gc将不会再次调用它,在.NET等一些环境中,你可以重新注册终结器,但我不确定java


Aar*_*paa 10

如果你绝对必须复活对象,这篇JavaWorld文章建议创建一个新实例,而不是复活正在最终确定的实例,因为如果最终确定的实例再次符合收集资格,它将被简单地收集(终结器将不会再次运行).


Mic*_*rdt 7

这种事情finalize()是一般不鼓励使用的原因.

  • 不,不应该使用finalize,因为它在以后的任意时间运行,或者根本不运行.应在finally块中显式释放非托管资源.充其量,finalize()可以添加故障保护. (7认同)