我知道当垃圾收集确定没有对该对象的更多引用时,垃圾收集器会在对象上调用Java finalize方法。
在应用程序退出后,Java finalize()方法是否会执行?
答案 0 :(得分:5)
在应用程序退出后,Java finalize()方法是否会执行?
通常没有。
但是,您可以调用(deprecated!) method来告诉JVM在JVM出口上完成对象。问题是它可能导致坏事发生;例如不稳定的行为和僵局。所以不要使用它!
通常,在应用程序代码中使用finalize
是个坏主意。如果你在这里尝试做的是实现一些关闭时间行为,那么更好的方法是将该行为实现为关闭钩子。
答案 1 :(得分:3)
没有。您可以致电Runtime.runFinalizersOnExit()
,但已弃用,因此可能无法使用。
解决方法是使用Runtime.addShutdownHook()
创建一个关闭钩子并在钩子中进行所有清理。
答案 2 :(得分:2)
finalize() methods do not run on application exit.
推荐的方法是使用关闭钩子。
e.g。
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
在以下情况下执行关闭挂钩: - 程序正常退出,例如System.exit - 用户中断,例如键入^ C,注销或系统关闭
Java还提供了一个名为runFinalizersOnExit()
的方法@deprecated
。它因以下原因而被弃用:
It may result in finalizers being called on live objects
while other threads are concurrently manipulating those objects,
resulting in erratic behavior or deadlock
基本上,runFinalizersOnExit()
是不安全的。如上所述,使用关闭钩子。