2010-06-26 62 views

回答

8

不,沒有「參考文獻列表」。 GC不需要知道引用對象的所有內容 - 它只需知道是否引用任何對象。

作爲GC的一個非常粗糙的模型,它將堆中的每個對象都標記爲垃圾,然後查看它認爲是非垃圾(「根」對象)的對象。例如,它會查看每個線程的堆棧以及線程中的每個實例方法,它通常會將目標實例標記爲非垃圾文件。

然後它會經過每個根,看看哪些對象那些那些指的是...並將它們標記爲非垃圾。它會緩解下來,找到它所能做的一切。然後可以收集(或確定)任何未被標記爲非垃圾的東西。

從這個算法中可以看出,GC不需要爲每個對象保留一個完整的引用列表 - 只是說一些「垃圾」或「非垃圾」。

很顯然,在Java和.NET中,GC比這個複雜得多,世代垃圾回收器和各種策略可以最大限度地減少GC「暫停」併爲GC使用多線程。希望這個簡化的視圖足以解釋爲什麼甚至GC也沒有引用列表。


並不總是,在.NET的情況下。一個對象可以被垃圾回收,而實例方法仍然在「運行」它,如果該方法沒有引用從當前點向前的對象中的任何字段。

0

如果您無法爲此找到語言支持,只需讓每個想要持有對所討論對象的引用的對象都調用一個方法,告訴正在引用的對象。然後該對象將引用對象添加到列表中。每當您放棄對該對象的引用時,就會調用另一種方法從列表中刪除引用者。

+1

很快就會變成病毒......因爲現在一個對象需要知道什麼時候它將被垃圾收集,以便它可以自行移除。你要麼終結一切都有終結者,要麼到處都有大量的代碼來執行家務管理。 – 2010-06-26 07:14:16

+0

多數民衆贊成在即時嘗試避免! 這是要變得沉重! 與他們之間的一些鏈接im計劃與10000對象和期望的模型。 如果生病只是在他們的名單上,它可以是一個100000的開銷到一個密爾參考 – kalix 2010-06-26 07:18:45

+0

@kalix:那麼你應該重新設計,以便你不需要知道「父母」。 – 2010-06-26 07:26:44