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