2010-08-05 103 views
1

我在讀「Joshua Bloch的有效Java編程,我建議不要使用」finalize「塊,因爲它不能保證被執行,任何人都可以解釋一下,或者給出一個一些文章的鏈接,解釋對此進行了詳細完成塊的問題

+2

你爲什麼打算使用終結器?我認爲Java中的finalizer最常見的問題是人們認爲它們的行爲與C++中的析構函數相同。 :)(另外,你的措詞「敲定塊」有可能與「finally塊」混淆。終結者本身不是塊。) – bzlm 2010-08-05 10:27:18

+0

你是否確定它們意味着敲定塊,而不是最終確定方法? – 2010-08-05 10:28:34

+0

這些都不是愚蠢的,但非常密切相關http://stackoverflow.com/questions/2954948/performance-implications-of-finalizers-on-jvm/2955757#2955757(從書中的項目很多報價); http://stackoverflow.com/questions/3038211/what-happens-if-an-exception-is-thrown-during-finalize; http://stackoverflow.com/questions/2860121/why-do-finalizers-have-a-severe-performance-penalty – polygenelubricants 2010-08-05 10:28:55

回答

1

一個與敲定的問題是,如果你的程序調用System.exit()它不會被調用? - 來處理這個我覺得喬希座建議您使用Runtime.addShutdownHook()代替

1

終結者的另一個問題,除了andrewmu提到的問題外,還涉及到經常創建/銷燬的對象。

爲具有高創建/銷燬率的類定義終結器時,可以將負載添加到終結器線程,可能會減慢這些對象的垃圾收集速率。這些對象不是在GC發生時立即被釋放,而是首先在終結器線程隊列中等待。這增加了內存不足錯誤的風險。

0

加上:如果你忘記打電話super.finalize(),它可能是一個錯誤。所以finalize()的執行是容易出錯