2010-02-04 41 views
1

你們可能會認爲,在15-20分鐘內,我已經問過4-5個關於同一主題的問題,所以我可能需要關於這個的教程。但我通過閱讀關於GC的文章來了解這些問題。垃圾收集器和finalize()方法

所以我的問題是GC只會在實例的一次生命週期中調用一個實例的finalize()方法,即使同一個對象在其finalize()方法中被垃圾收集的時候忽略不計。所以我想知道GC如何知道它在第二次收集它之前執行過一次finalize()方法

回答

4

說實話,你的生活會更好,如果你忘了,終結存在。我一直在編寫Java多年,從來沒有理由使用終結器。

他們很慢,沒有明確定義(有時他們永遠不會跑!),並且通常是PITA。

如果您正在管理外部資源,並且使用try {} finally {}塊進行清理,請沿着Closeable接口的行進行操作。否則,請嘗試儘可能多地信任語言以清理內存。

1

取決於實現。據推測,虛擬機在每個對象上都有一個祕密位,或者有一個包含已經「完成」的對象的表。如果我不得不猜測,我會說後者,因爲大概已經完成的對象仍然處於閒置狀態,預計會很小,所以系統中每個對象都有點似乎有點浪費。

+0

祕密位。定稿可能很容易成爲瓶頸。 – 2010-02-04 19:46:38

+0

@tackline有趣。謝謝。 – 2010-02-04 20:11:09

0

你丫再:)

注意,在終結的主題,如果你真的FORCE使用JVMTI的ForceGargabeCollection一個GC,它是專門指出:

「此功能不會造成終結者將被運行。「

再次,你可能真的不希望這樣做,但當時如果你有2K +代表以及有關GC 5個問題被認爲這是有趣的不斷重複,使用JVMTI的ForceGarbageCollection你真的可以FORCE一GC。

權威信息,以如何強制GC:

http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection