在定版期间对对象的引用

2022-09-02 03:29:58

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

class foo {
    ...
    public void finalize() {
        bar.REFERENCE = this;
    }
}

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


答案 1

该对象未被垃圾回收。这被称为“物体复活”。

你必须小心,一旦终结器被调用,gc就不会再调用它,在某些环境(如.NET)上,你可以重新注册终结器,但我不确定java


答案 2

如果你绝对必须复活对象,这篇 JavaWorld 文章建议创建一个新实例,而不是复活正在完成的实例,因为如果正在完成的实例再次符合收集条件,它只会被收集(终结器不会再次运行)。