@Jason:對於f-reachable隊列是如此。但恕我直言,它並沒有解釋爲什麼有自己的定稿隊列。
我的猜測是,終結隊列有加另一個信息,幫助GC 所有對象的生命週期的可能狀態之間進行區分。
對象頭部中的終結標誌表示「對象需要終結」或「對象不需要終結」,但並不表示終止是否已經發生。
但說實話,我不明白爲什麼它需要在當前的定稿過程實施。
事實上,這裏是天真的流程我想可能沒有終結隊列:
- 創建對象時,如果它有一個終結,則GC設置結束標誌;
- 如果後來SupressFinalize被調用,那麼該標誌被歸零;
- 現在讓我們跳到GC收集對象的方式,該對象從任何地方都沒有被引用:如果設置了終結標記,則GC將該對象的引用放入f-reachable隊列,並讓終結線程運行;
- 後來終結線程退出引用,重置終結標誌並運行終結器;
- 如果對象想要重新設定以後它可以ReRegisterForFinalize重新設置終止標誌;
- 後來GC再次收集對象:如果沒有設置終結標誌,它知道沒有什麼要做,然後釋放對象內存;
- 如果設置了終結標誌,則GC再次將該對象的引用排入f可到達的隊列,然後再次進入另一輪;
- 在某個時間點對象很高興,完成定稿並收集;或者應用程序域或進程被關閉並且無論如何都釋放內存。
因此,似乎在這些情況下不需要定型隊列,只有定型標誌是有用的。
一個可能的原因是,從概念的角度來看,可能會有一條規則:「一個對象被收集,當且僅當它沒有被任何根引用」。 因此,沒有確定隊列,並且根據對象狀態本身收集對象的決定,檢查確定標誌,與此規則不兼容。
但是我真的不認爲GC的實現是基於這種理論規則的教條性應用,而只是基於實用的選擇;所以很明顯,我錯過了一些關鍵場景,其中GC需要確定隊列才能知道在收集對象時要做什麼,但是哪些是?
哪個實現? – R0MANARMY 2011-04-11 23:45:30
垃圾回收.. – paseena 2011-04-11 23:46:30
我認爲@ R0MANARMY表示哪個GC實現。 Universe中有多個.NET框架的實現。無論如何,哪個實現應該沒有關係,因爲問題是關於爲什麼* GC實現會實現終結器隊列。 – 2011-04-11 23:49:08