2013-07-09 171 views
1

我發現了一個有趣的說法在.NET Performance Testing and Optimization - The Complete Guide書228頁無根Gen 2的對象引用的第1代對象:垃圾收集是由

值得一提的是,其通過引用的任何1代的對象未收集的Gen 2對象不是收集在第1代收集中的 ,但僅在第2代收集中收集其父項。

是對的,如果是這樣,爲什麼?

+1

如果一個對象被尚未被收集的另一個對象引用,則該子對象本身不會被收集,原因很明顯。如果父母沒有根治,你會認爲孩子會被收集,但問題是GC還不知道。如果它知道或者試圖找出答案,那麼它不會是Gen 1的一個集合,它會是一個Gen 2。這就是它所做的,它等待第二代的發生。 –

+0

你說得對,但是在同樣的情況下,Gen 0和Gen 1呢?本書的作者沒有強調它 –

回答

3

我會想象,這是因爲Gen 1對象是由Gen 2對象生根/引用的,所以Gen 1對象不能被收集直到它不再被引用,這將在Gen 2對象引用它被收集。

+0

但第2代對象不是應用程序的根,比如全局和靜態對象或線程堆棧上的局部變量/參數對象指針,不是嗎? –