Java 什么时候调用 finalize() 方法?

新手上路,请多包涵

我需要知道何时在 finalize() JVM 。我创建了一个测试类,当通过覆盖它调用 finalize() 方法时写入文件。它没有被执行。谁能告诉我它不执行的原因?

原文由 Rajesh Kumar J 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

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

当垃圾收集确定不再有对该对象的引用时,由垃圾收集器对该对象调用。

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

此外,不保证垃圾收集器在任何特定时间运行。总的来说,我想说的是 finalize() 可能不是通常使用的最佳方法,除非您有特殊需要。

原文由 user7094 发布,翻译遵循 CC BY-SA 3.0 许可协议

finalize 方法在对象即将被垃圾收集时调用。这可以在它有资格进行垃圾收集后的任何时间进行。

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

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

如果您依赖 finalize 来正确运行您的应用程序,那么您做错了什么。 finalize 应该 用于清理(通常是非Java)资源。这 正是 因为 JVM 不保证 finalize 曾经在任何对象上被调用过。

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题