我需要知道何时在 finalize()
JVM
。我创建了一个测试类,当通过覆盖它调用 finalize()
方法时写入文件。它没有被执行。谁能告诉我它不执行的原因?
原文由 Rajesh Kumar J 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要知道何时在 finalize()
JVM
。我创建了一个测试类,当通过覆盖它调用 finalize()
方法时写入文件。它没有被执行。谁能告诉我它不执行的原因?
原文由 Rajesh Kumar J 发布,翻译遵循 CC BY-SA 4.0 许可协议
finalize
方法在对象即将被垃圾收集时调用。这可以在它有资格进行垃圾收集后的任何时间进行。
请注意,一个对象完全有可能永远不会被垃圾收集(因此 finalize
永远不会被调用)。当对象永远不符合 gc 的条件(因为它在 JVM 的整个生命周期内都可以访问)或者在对象符合条件和 JVM 停止运行之间实际上没有垃圾收集运行时(这通常发生在简单的情况下),就会发生这种情况测试程序)。
有一些方法可以告诉 JVM 在尚未调用它的对象上运行 finalize
,但使用它们也不是一个好主意(该方法的保证也不是很强) .
如果您依赖 finalize
来正确运行您的应用程序,那么您做错了什么。 finalize
应该 只 用于清理(通常是非Java)资源。这 正是 因为 JVM 不保证 finalize
曾经在任何对象上被调用过。
原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 3.0 许可协议
8 回答6.6k 阅读
4 回答713 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答974 阅读✓ 已解决
一般来说,最好不要依赖
finalize()
进行任何清理等。根据 Javadoc (值得一读),它是:
正如 Joachim 所指出的,如果对象总是可访问的,那么这在程序的生命周期中可能永远不会发生。
此外,不保证垃圾收集器在任何特定时间运行。总的来说,我想说的是
finalize()
可能不是通常使用的最佳方法,除非您有特殊需要。