2013-09-21 53 views
1

我知道當垃圾回收確定沒有更多的對象引用時,垃圾回收器會在對象上調用Java finalize方法。Java終結器方法

在應用程序退出後執行Java finalize()方法嗎?

+0

即使JVM關閉,也不能保證它會被執行。 –

回答

3

不可以。您可以撥打Runtime.runFinalizersOnExit(),但已棄用,因此可能無法正常工作。

一個解決方法是創建一個關閉鉤子Runtime.addShutdownHook()並做所有的清理工作。

5

在應用程序退出後執行Java finalize()方法嗎?

通常沒有。

但是,您可以調用一個(deprecated!) method來通知JVM完成JVM退出時的對象。問題是它可能導致不好的事情發生;例如不穩定的行爲和僵局。所以不要使用它!


通常,在應用程序代碼中使用finalize是一個壞主意。如果你在這裏試圖做的是實現一些關閉時間行爲,那麼更好的方法是將行爲實現爲關閉掛鉤。

2
finalize() methods do not run on application exit. 

推薦的方法是使用關閉掛鉤。

例如程序退出通常例如 - :

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()是不安全的。如上所述使用關閉掛鉤。