为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 关于 Finalize 方法的断言正确吗?

Java 8 关于 Finalize 方法的断言正确吗?

慕田峪4524236 2024-01-17 16:47:40
我一直在阅读 Kathy Sierra + Bert Bates 撰写的《OCA Java SE 8 程序员 I 考试指南》一书。关于 Finalize 方法,我不太明白。第 218 页指出:调用finalize()实际上可以导致保存对象免遭删除。稍后第 222 页:您可以从内部使对象不符合 GC 条件finalize()。英语不是我的母语,但我在这两种情况下的理解是该finalize()方法可以防止对象被垃圾收集?是这样吗?还是我误解了它?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

这实际上更像是一个理论上的事情:当对象不再被其他活动对象引用时,它们就有资格进行垃圾回收。

因此:您可以尝试finalize(). 从理论上讲,这将阻止该物体被移除。

实际上有一个“模式名称”:对象复活。现在,这是一种模式,还是更多的模式,值得争论。

(就我个人而言:我永远不会这样做,而且我从来没有遇到过需要使用这种模式的情况)


查看完整回答
反对 回复 2024-01-17
?
狐的传说

TA贡献1804条经验 获得超3个赞

Finalize 是由 JVM 而不是由用户调用的方法,该方法在对象被垃圾收集之前执行,您可以重写 Finalize 方法以在对象被处置之前执行清理操作,或者正如书中所述,有可能您可以防止该对象被垃圾收集。


您可以参考下面的代码作为避免对象被垃圾收集的示例。


class Example { 


    static Example y; 


    void func() { 

        Example x = new Example(); 

    } 


    pubic void finalize() { 


        y = this; // Putting the reference id 

        // of the current object 

        // into the static variable y 


        System.out.println("The object won't be collected by the garbage collector"); 


    } 


    public static void main(String a[]) {

        func(); // function called 

    } 

}


查看完整回答
反对 回复 2024-01-17
?
阿晨1998

TA贡献2037条经验 获得超6个赞

嗯,确实如此。


finalize()当 GC 决定应该删除该对象时,将调用该方法,但这并不意味着该对象将在finalize完成后立即被删除。


IT DOESN'T WORK THIS WAY:

_________________________

IF shouldBeRemoved(object)

   object.finalize();

   remove(object);

执行后finalize,GC将再次检查该对象是否仍应被删除。为了符合删除资格,不应从可从根对象访问的任何对象引用对象。


IT WORKS THIS WAY

_________________

LABEL

IF shouldBeRemoved(object)

    object.finalize();

    IF shouldBeRemoved(object)

        remove(object);

    ELSE

        GOTO LABEL

让我们想象一下以下情况:


class Foo {

    Application a;


    Foo(){};


    @Override

    public void finalize() {

        this.a = Application.getInstance();

    }

}

其中Application是代表 的根对象的类Application。在这种情况下,由于a仍然可达,Foo之前符合删除资格的类的对象刚刚复活。


重要说明


不能保证 会finalize被调用,因为它需要另一个对象来处理finalize被调用的方法,因此如果堆上没有足够的可用空间,对象可能会在不调用的情况下被销毁finalize。


查看完整回答
反对 回复 2024-01-17
  • 3 回答
  • 0 关注
  • 105 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信