[英]Java Finalize method call when close the application
我對finalize方法有疑問。 如果我有許多具有很多繼承的類,那么在應用程序關閉時如何調用所有finalize方法?
System.runFinalizersOnExit(true)
,但請注意,它已被棄用。 如果您依靠這種事情,那么您基本上已經在做錯事了。
finalize()
方法不會在應用程序退出時運行。
推薦的方法是使用關閉鈎子。
例如
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
// shutdown logic
}
});
在以下情況下執行關閉掛鈎:
Java還提供了@deprecated
的方法runFinalizersOnExit()
。 不推薦使用它的原因如下:
這可能會導致在活動對象上調用終結器,而其他線程正在同時操縱這些對象,從而導致行為不穩定或死鎖
本質上, runFinalizersOnExit()
是不安全的。 如上所述,請使用關閉鈎子。
如果您需要清理事物,關閉日志文件,發送警報或在Java虛擬機關閉時采取其他措施,特別是有人按下CTRL + C並關閉VM或發送kill信號時,在Unix / Linux中,則必須查看ShutdownHook 。
關閉鈎子只是一個已初始化但未啟動的線程。 當虛擬機開始其關閉序列時,它將以未指定的順序啟動所有已注冊的關閉掛鈎,並使其同時運行。 當所有掛鈎完成后,如果啟用了退出時終結,則它將運行所有未調用的終結器。 最后,虛擬機將停止。 請注意,如果關閉是通過調用exit方法啟動的,則守護程序線程將在關閉序列期間繼續運行,非守護程序線程也將繼續運行。
最好不要依靠finalize()來清理JVM中的資源。
來自Javadoc 。
當垃圾回收確定不再有對該對象的引用時,由垃圾回收器在對象上調用。 子類覆蓋finalize方法以處置系統資源或執行其他清除。
編輯:請參閱此博客有關finalize()的用法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.