关闭应用程序时调用Java Finalize方法

时间:2013-09-08 07:16:16

标签: java finalizer

我对finalize方法有疑问。如果我有许多具有许多继承的类,那么当应用程序关闭时如何调用所有finalize方法?

4 个答案:

答案 0 :(得分:11)

System.runFinalizersOnExit(true),但请注意,它已被弃用。如果你依赖这类事情,你基本上已经做错了。

答案 1 :(得分:6)

finalize()方法不会在应用程序退出时运行。

推荐的方法是使用关闭钩子。

e.g。

Runtime.getRuntime().addShutdownHook(new Thread() {
    public void run() {
        // shutdown logic
    }
});

在以下情况下执行关闭挂钩:

  • 程序正常退出,例如System.exit
  • 用户中断,例如键入^ C,注销或系统关闭

Java还提供了一个名为runFinalizersOnExit()的方法@deprecated。它因以下原因而被弃用:

  

可能会导致在活动对象上调用终结器       而其他线程同时操纵这些对象,       导致不稳定的行为或死锁

基本上,runFinalizersOnExit()是不安全的。如上所述,使用关闭钩子。

答案 2 :(得分:1)

如果您需要清理内容,关闭日志文件,发送警报或在Java虚拟机关闭时执行其他操作,尤其是有人按下CTRL + C并关闭VM或发送Unix / Linux中的kill信号,你必须看ShutdownHook

关闭钩子只是一个初始化但未启动的线程。当虚拟机开始其关闭序列时,它将以某种未指定的顺序启动所有已注册的关闭挂钩,并让它们同时运行。当所有挂钩都完成后,如果启用了finalization-on-exit,它将运行所有未读取的终结器。最后,虚拟机将停止。请注意,守护程序线程将在关闭序列期间继续运行,如果通过调用exit方法启动关闭,则非守护程序线程将继续运行。

答案 3 :(得分:-1)

最好依靠finalize()来清理JVM中的资源。

来自Javadoc

  

垃圾收集时由垃圾收集器调用对象   确定没有对该对象的更多引用。一个子类   覆盖最终化方法来处理系统资源或   进行其他清理。

修改:请参阅此博客,了解finalize()用法