Java 如何确定何时调用finalize()方法

Java 如何确定何时调用finalize()方法,java,finalizer,Java,Finalizer,我想检查输出是否显示何时调用finalize(),何时实际删除对象。但是我无法跟踪,是不是因为根据JVM,对象将被垃圾收集?如果重写finalize()方法会发生什么?我们必须明确地称之为我们自己吗?那么,为什么Netbeans建议用super.finally()添加finally块?您可以使用引用与GC交互,如图所示。特别是,保留对对象的引用(使用ReferenceQueue创建)可以让您选择在对象被GC-ed时收到通知。请先尝试阅读,然后再深入查看我的答案。在大多数情况下,您可以找到更好的解

我想检查输出是否显示何时调用
finalize()
,何时实际删除对象。但是我无法跟踪,是不是因为根据JVM,对象将被垃圾收集?如果重写
finalize()
方法会发生什么?我们必须明确地称之为我们自己吗?那么,为什么Netbeans建议用
super.finally()
添加
finally
块?

您可以使用引用与GC交互,如图所示。特别是,保留对对象的引用(使用ReferenceQueue创建)可以让您选择在对象被GC-ed时收到通知。

请先尝试阅读,然后再深入查看我的答案。在大多数情况下,您可以找到更好的解决方案,然后依靠finalize方法行为

如果出于某种原因仍需要使用
finalize()
,则可以使用以下示例:

class Example {
    @Override
    protected void finalize() {
        System.out.println("Object getting garbage collected");    
    } 
}

public class GarbageCollectionDemo {
    public static void main(String [] args) {
        Example e1 = new Example();
        {
            Example e2 = new Example();
        }
        e1.finalize();  
    }
}
但这并不能保证,即使在这种情况下它也会被终结

如果重写finalize()方法会发生什么?我们必须明确地称之为我们自己吗

您只需重写它,就像其他任何方法一样。不,您不必自己调用它,它将在对象终结时调用

那么为什么Netbeans建议使用super.finally()添加finally块呢

您的超类在其
finalize()
方法的实现中可能具有特定的行为。Netbeans尝试防止这种情况,当此逻辑不被调用时,如果您忘记调用
super.finally()
,或者您的逻辑将在超类finilize调用之前引起异常。

可能重复的
finalize()
finally
块不同。如果
finalize()
被调用,但这并不意味着对象被垃圾收集。
class SimpleClass {
    @Override
    protected void finalize() {
        System.out.println("Object getting garbage collected");
    }
}

public class GarbageCollectionDemo {
    public static void main(String [] args) throws InterruptedException {
        GarbageCollectionDemo demo = new GarbageCollectionDemo();
        demo.call();
        System.gc();
        Thread.sleep(1000);
        System.out.println("Collected");
    }

    public void call() {
        SimpleClass e1 = new SimpleClass();
    }
}