2012-02-07 106 views
1

有兩個場景,我想了解如何將GC將採取行動垃圾收集器在這種情況下會做什麼?

1在兩個對象 - object1和對象2 object1對Object2的參考和對象2對object1 參考現在,這兩個目標都沒有使用,GC可以收集它們。

會發生什麼? GC是否跳過此集合? ?

2-同樣的問題,但我們有4(或n)對象,彼此有參考。 什麼GC將在這種情況下做?

+0

可能的重複[CLR垃圾回收方法是否意味着可以安全地拋出循環對象引用?](http://stackoverflow.com/questions/2191565/does-the-clr-garbage-collection-methodology-mean -its-safe-to-throw-circular-obj) – 2012-02-07 13:06:20

回答

3

通過.NET使用的GC是tracing garbage collector(「標記和清除」是一個關聯詞)

內存對象被認爲是「垃圾」,如果他們不能再由非以下指針/引用到達 - 程序內存中的垃圾部分。

爲了確定什麼是可到達的和哪些不可達,GC首先建立一組根引用/指針。這些是保證可達的參考。例子包括局部變量和靜態字段。

然後,它會遞歸地跟蹤這些引用(跟蹤)並將它遇到的每個對象標記爲「不垃圾」。一旦用完了引用,它就會進入「掃描」階段,其中沒有標記爲「非垃圾」的每個對象都被釋放(可能包括調用對象的終結器)。

因此,只要您的「對象環」中的任何對象都沒有被「活」對象的任何部分引用,就會被垃圾收集。

0

AFAIK,GC只收集不再有任何引用的對象。所以只要有一個對象提及它,它就不會被收集。

如果對象存在的時間足夠長,它們將在收集週期的下一個階段結束。

0

我不確定,但你可以通過創建大量的對象(4線程,填充列表),然後清零列表來嘗試它。 如果RAM下山的時候,知道有被引用對象的塊的引用了,如果沒有它不:)

5

不同於COM,公共語言運行時不使用參考計數以管理對象的生命期。相反,垃圾收集器跟蹤對象引用,並標識不能再通過運行代碼訪問的對象。

這大大簡化了組件編程,因爲您不必擔心循環引用。 如果一組對象包含彼此的引用,但這些對象都不是直接或間接從堆棧或共享變量引用的,則垃圾回收將自動回收內存

http://msdn.microsoft.com/en-us/library/0t81zye4(v=vs.71).aspx