Java 中何时调用 finalize() 方法?

我需要知道何时在 .我创建了一个测试类,当通过重写方法调用该方法时,该类会写入文件。它不会被执行。谁能告诉我它为什么不执行的原因?JVMfinalize()


答案 1

当对象即将被垃圾回收时调用该方法。这可以在符合垃圾回收条件后的任何时候。finalize

请注意,对象完全有可能永远不会被垃圾回收(因此永远不会被调用)。当对象永远不会符合 gc 的条件(因为它在 JVM 的整个生命周期内都可以访问)时,或者当对象符合条件的时间和 JVM 停止运行时,实际上没有垃圾回收运行(这通常发生在简单的测试程序中)时,可能会发生这种情况。finalize

有一些方法可以告诉JVM在尚未调用的对象上运行,但是使用它们也不是一个好主意(该方法的保证也不是很强)。finalize

如果您依赖应用程序的正确操作,那么您做错了什么。 应仅用于清理(通常是非 Java)资源。这恰恰是因为JVM不能保证在任何对象上调用它。finalizefinalizefinalize


答案 2

一般来说,最好不要依赖做任何清理等。finalize()

根据Javadoc(值得一读),它是:

当垃圾回收确定没有更多对对象的引用时,由对象上的垃圾回收器调用。

正如Joachim所指出的,如果对象始终可访问,那么在程序的生命周期中可能永远不会发生这种情况。

此外,不保证垃圾回收器在任何特定时间运行。一般来说,我想说的是,除非有特定的东西需要它,否则可能不是一般使用的最佳方法。finalize()