Java Finalizer方法

时间:2013-09-21 02:58:12

标签: java finalizer

我知道当垃圾收集确定没有对该对象的更多引用时,垃圾收集器会在对象上调用Java finalize方法。

在应用程序退出后,Java finalize()方法是否会执行?

3 个答案:

答案 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()是不安全的。如上所述,使用关闭钩子。