2015-10-06 39 views
0
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()如何确定何时finalize()方法被调用

+3

可能重复[何时在Java中调用finalize()方法?](http://stackoverflow.com/questions/2506488/when-is-the-finalize-method-called-in-java) – Reinard

+5

' finalize()'不*与'finally'块相同。 – RealSkeptic

+0

如果调用'finalize()',它并不意味着该对象被垃圾回收。 –

回答

2

您可以使用参考文献与GC进行交互,例如显示为here。特别是,保持对象的引用(使用ReferenceQueue创建)可以让您在对象进行GC编辑时获得通知。

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(); 
    } 
} 

但它不能保证,它甚至会在这种情况下finilized。

如果我们重写finalize()方法会发生什么?我们是否必须自己明确地调用它?

您可以像其他方法一样覆盖它。不,你不必自己调用它,它会在对象完成时被调用。

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

您的超类可能会在执行finalize()方法时发生特定行为。 Netbeans试图阻止这种情况发生,当这个逻辑不会被调用时,如果你忘记调用super.finally()或者你的逻辑会在SuperClass完成调用之前引发一个异常。