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

时间:2015-10-06 15:01:46

标签: java finalizer

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()时输出是否显示,以及实际删除对象的时间。但我无法跟踪,是因为它根据JVM对象将被垃圾收集?如果我们覆盖finalize()方法会发生什么?我们必须自己明确称呼它吗?那么为什么Netbeans建议用finally添加super.finally()块?

2 个答案:

答案 0 :(得分:2)

您可以使用引用与GC进行交互,例如显示here。特别是,为对象保留一个引用(使用ReferenceQueue创建),可以选择在对象进行GC编辑时得到通知。

答案 1 :(得分:1)

在深入了解我的答案之前,先尝试先阅读Why not to use finalize() method in java。在大多数情况下,您可以找到更好的解决方案,然后依靠finalize方法行为。

如果由于某种原因仍然需要使用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();
    }
}

但它无法保证,即使在这种情况下它也会被确定。

  

如果我们覆盖finalize()方法会发生什么?我们必须自己明确称呼它吗?

你可以像任何其他方法一样覆盖它。不,你不必自己打电话,它会在对象定稿时被调用。

  

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

您的超类可能在其finalize()方法的实现中有特定的行为。如果您忘记调用super.finally()或者您的逻辑将在SuperClass完成调用之前导致异常,Netbeans会尝试阻止此情况,此时逻辑将不会被调用。