2009-07-19 38 views
0

如果我在一個類Foo中實現了一個析構函數,Foo的實例將在最終化隊列中緊密跟蹤。當Foo的一個實例被垃圾收集時,我明白CLR會在最終化隊列中看到條目,並通過將該對象從堆中移動到最終化可到達表中來爲該對象提供特殊處理。那麼......沒有其他的垃圾收集週期發生?定稿可到達表

在下一次垃圾回收循環中總會調用finalize()嗎?

爲什麼在將我的對象複製到freachable表後不立即調用finalize? (這看起來像是額外的不必要的複雜性)

回答

1

終結器隊列是爲了簡化事情;沒有它就會變得更加複雜。 GC運行時,不需要執行託管代碼 - 否則,如果用戶代碼在中間運行,GC所做的所有分析可能都是無效的。

因此,當GC運行時,必須延期完成,而不是立即執行。在單獨的線程中運行它可以最大限度地縮短VM需要獨佔訪問所有線程的時間,並增加併發活動的可能性。瞭解。

+0

瞭解。但是爲什麼垃圾收集器在完成循環時不會啓動Finalize()線程呢?爲什麼要等待下一個週期? – 2009-07-19 17:37:00