小编典典

Java和手动执行finalize

java

如果我finalize()从程序代码中调用一个对象,那么当垃圾回收器处理该对象时, JVM是否 还会再次运行该方法?

这是一个大概的例子:

MyObject m = new MyObject();

m.finalize();

m = null;

System.gc()

是否要显式调用以finalize()使 JVM 的垃圾回收器不对finalize()对象运行该方法m


阅读 360

收藏
2020-09-21

共1个答案

小编典典

根据这个简单的测试程序,即使您显式调用了JVM,JVM仍将对finalize()进行调用:

private static class Blah
{
  public void finalize() { System.out.println("finalizing!"); }
}

private static void f() throws Throwable
{
   Blah blah = new Blah();
   blah.finalize();
}

public static void main(String[] args) throws Throwable
{
    System.out.println("start");
    f();
    System.gc();
    System.out.println("done");
}

输出为:

开始
定案!
定案!
完成

那里的每个资源都说永远不要显式地调用finalize(),甚至几乎永远都不会实现该方法,因为无法保证何时以及何时调用它。最好只手动关闭所有资源。

2020-09-21