4

在 C# 中,当没有对它的引用时,对象会被垃圾回收。假设是这种情况,是否会收集以下任何一种,或者垃圾收集器是否足够聪明以丢弃它们?

class Program
{
    static void Main()
    {
        A a = new A();
        a.b = new B();
        a.b.a = a;
        a = null;
    }

{

class A
{
    public B b;
}

class B
{
    public A a;
}
4

1 回答 1

9

一旦不再需要它们,它们都将有资格收集。这意味着在某些情况下,甚至可以在定义对象的范围结束之前收集对象。另一方面,实际收集也可能发生得更晚。

.NET 垃圾收集器不基于引用计数,因此循环依赖没有区别。

它基于mark-and-sweep算法,将所有对象视为收集的候选对象,然后从可用的根(局部变量、静态变量)遍历对象图,将它们标记为仍然“活着”。那些没有被标记为仍在使用的,被收集起来。请注意,这有点简化描述:.NET 中真正的算法是采用 mark-and-sweep,托管堆分为 3 代 + 大对象堆,finalization 完全忽略等。

我建议查看Maoni Stephens 的博客以获取更多信息。

于 2013-04-13T21:41:00.587 回答