2009-01-24 36 views

回答

0

Java GC可以檢測週期並處理它們。我敢打賭,C#GC也可以。

11

它不再需要CLR去除循環引用而不是非循環引用。 CLR使用技術的組合來進行垃圾收集。快速版本雖然是從所有根目標對象開始的(堆棧中的對象,或者用強大的GC句柄保存)。任何可從這些對象訪問的對象都處於活動狀態。其他任何東西都會被收集。循環引用不會影響此算法的結果,除了CLR必須確保檢查它們而不是循環訪問外,其他操作不會影響此算法的結果。

3

它不需要檢測循環,因爲在它使用的算法中,循環根本不是問題。

如果從某個根(棧上的一個變量,或一個靜態變量,基本上,因爲這些已知是活的,並且不能被GC'ed)到一個對象的路徑,則該對象必須也要活着,並且不會得到GC。

如果沒有路徑,那麼該對象已經死亡並且可以安全地進行GC操作。循環根本無關緊要。所以不,週期不會對物體的壽命產生影響。

1

基本上,如果任何靜態,局部變量,參數或成員變量引用一個對象,它就不可用於垃圾回收。循環引用是否存在並不重要。循環被引用,在這種情況下它不被收集,或者在沒有被引用的情況下可以收集整個循環。

如果某個類型實現了終結器,它將處理集合直至終結器運行完畢。

1

GC將收集未被根對象引用的任何對象。根對象通常是所有appdomains(即加載的程序集/類型對象),全局和靜態對象引用,每個線程相應堆棧上的所有對象引用以及當前加載到CPU寄存器中的任何對象引用引用的對象。

在收集時,GC遍歷所有已知根對象的引用,並將它沿途找到的任何對象標記爲「正在使用」。完成後,任何未標記的物體都可以安全地收集。

因此,如果沒有任何對象被根對象引用(直接或間接),則是否有循環引用並不重要。無論如何,他們都將有資格收藏。我說符合條件,因爲GC使用三種不同的策略來收集符合條件的對象,並且出於性能原因,只有其中一個在運行時收集所有符合條件的對象。

通常情況下,您不必考慮這一點,它只是起作用。但垃圾收集還有很多,你仍然需要了解它的基本原理,以便理解內存管理和編寫不會泄漏資源的無錯代碼等,因此每個.NET開發人員都應該看一看。以下是一些資源,可以更詳細地解釋CLR如何進行垃圾回收。

MSDN - Garbage Collector Basics and Performance Hints (Rico Mariani)

MSDN Magazine - Garbage Collection (Part 1): Automatic Memory Management in the Microsoft .NET Framework (Jeffrey Richter)

MSDN Magazine - Garbage Collection (Part 2): Automatic Memory Management in the Microsoft .NET Framework (Jeffrey Richter)