关于.NET中垃圾收集的问题

时间:2010-07-08 11:24:32

标签: .net garbage-collection

我认为我的问题可能与this question here有关,但无论如何我都会问它!

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

参考文献B. 参考文献C. B引用C(反之亦然,循环)

B-> C引用会导致A在收集时不被垃圾收集吗?

3 个答案:

答案 0 :(得分:5)

您所链接的问题的答案解释得很清楚。垃圾收集器旨在处理在一个循环中相互引用的对象。

如果你的三个对象相互引用,而其他任何对象都没有引用它们,则整个周期都有资格收集。

答案 1 :(得分:0)

只要C不引用A,那么A将被垃圾收集。这个想法是,一旦对特定对象的所有引用都超出范围或被取消/处置,GC就会启动。因此,虽然A引用C,但如果反之则不是,则C无法保持句柄甲

编辑:虽然我刚读过你说他们也互相引用,反之亦然。在这种情况下,它不会像其他人提到的那样进行GCed。

答案 2 :(得分:0)

GC将收集根对象未引用的任何对象。 Root对象通常是所有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)