【问题标题】:Java Finalize method not invoking [duplicate]Java Finalize方法未调用[重复]
【发布时间】:2018-12-03 07:14:53
【问题描述】:

这是一段代码。 finalize() 方法应该在 System.gc() 命令之后调用,但不是。 有什么建议吗?

class test123{
    test123(){
        System.out.println("Inside the constructor");

    }
}
public class finalizemerthd {

    public static void main(String args[]) {
        test123 obj1 = new test123();
        obj1 = null;
        System.gc();

    }

    protected void finalize() throws Throwable
    {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

【问题讨论】:

  • 您在finalizemerthd 类中声明了finalize 方法。但是您没有要清理的该类的实例。您应该将其添加到您的 test123 类中。阅读方法的文档,做一些研究。另请注意,System.gc() 仅请求 GC 运行。它可能并且将会延迟甚至忽略运行。
  • 请注意,自 Java 9 以来,finalize弃用(请参阅documentation)。
  • 还请下次使用@Override 表示finalize() 方法,因为我真的很困惑!
  • 请遵守命名约定。 PascalCase. 中的类名

标签: java garbage-collection finalize


【解决方案1】:

System.gc() 只请求收集,不保证垃圾收集。

此外,它的对象正在被垃圾收集的类的 finalize 方法被调用,这在您的场景中不是这种情况。

请在下面找到更新的代码和输出:

class Test123 {
    Test123() {
        System.out.println("Inside the constructor");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Garbage collector called");
        System.out.println("Object garbage collected : " + this);
    }
}

public class Finalizemerthd {
    public static void main(String args[]) {
        Test123 obj1 = new Test123();
        obj1 = null;
        System.gc();
    }
}

输出:

Inside the constructor
Garbage collector called
Object garbage collected : MyGenerator.Test123@11adfb87

【讨论】:

  • 我想补充一点,自 Java 9 以来,finalize弃用
  • 有可能finalize()main 方法退出之前仍然没有被调用,因此JVM 终止。由于 JVM 终止,最终确定甚至可能在中间被杀死。就像文档说的那样不可靠。
猜你喜欢
  • 2011-07-07
  • 2017-09-19
  • 2019-04-10
  • 1970-01-01
  • 2018-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-20
相关资源
最近更新 更多