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()
块?
答案 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会尝试阻止此情况,此时逻辑将不会被调用。