2010-07-08 43 views
0

我认为我的问题可能与this question here有关,但我仍然会问这个问题!关于在.NET中垃圾收集的问题

如果我有三个对象:A,B和C,其中

A引用乙 A引用Ç 乙引用C(并且反之亦然,周期性)

将所述B-> C基准原因A否则可能会收集垃圾?

+0

感谢您对您的所有答复! – 2010-07-08 12:57:12

回答

5

你已经链接的问题的答案可以很好地解释它。垃圾收集器旨在处理在一个循环中彼此相互引用的对象。

如果你的三个对象相互引用,并且没有其他对象引用它们中的任何一个,那么整个循环就有资格收集。

+2

小挑逗:“整个周期*可以一次收集” - 即他们都有资格收集。不能保证他们都会在同一集团收集和销毁,特别是如果有一个分析员要求对其进行重新安排。 – 2010-07-08 11:29:58

0

只要C没有引用A,那么A就会被垃圾收集。这个想法是,一旦所有对特定对象的引用都不在作用域内,或者被忽略/处置掉,GC就会启动。因此,尽管A引用了C,但如果反过来不是真的,那么C就没有办法处理A.

编辑:虽然我刚才读到,你说他们也相互引用了对方。在这种情况下,它不会像上面提到的其他人一样被GCed。

0

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)