[英]How does garbage collection collect self-referential objects?
如果某個對象未被任何其他對象引用,則它將由.NET CLR垃圾收集器收集。
但是,如果objA
引用objB
, objB
引用objC
, objC
引用回objA
,垃圾收集器如何確定它們(作為一個整體)可以被收集?
CLR使用稱為標記和掃描的技術。
作為該技術的一部分,可以將每個對象視為最初標記為收集。 然后,CLR遍歷每個可訪問對象,從您的全局(靜態字段等)作為根開始,並清除每個可步移對象上的標記。 然后掃描剩余的標記對象。
請記住,這個“標記”是概念性的; 實際上,對象很可能被添加到集合集中。
在循環自引用對象的情況下,將不會從應用程序中找到對象的引用,因此算法將永遠不會到達那些對象以“取消標記”它們。
GC具有所有已創建對象的列表。 在garbarge過程中,它從全局根(如靜態字段)開始,並遍歷每個引用的對象。 可以銷毀所有未被命中的列表中的每個對象。
如果無法點擊objA,objB或objC,將收集所有這些對象
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.