一尘不染

垃圾收集器和循环引用

c#

考虑以下两类:

public class A
{
     B b;
     public A(B b) { this.b = b; }
}

public class B
{
     A a;
     public B() { this.a =  new A(this); }
}

如果我有如上所述设计的类,那么此类对象将由垃圾收集器(GC)收集吗?

假设我这样做:

void f()
{
     B b = new B();
}

在此方法中,我创建了一个B名为的实例b,当该方法返回时,b超出了范围,GC应该能够收集它,但是如果要收集它,则必须首先收集a它的成员。属于B并收集的a,它需要b首先收集,这是的成员A。变成圆形。所以我的问题是:这样的循环引用会阻止GC收集对象吗?

  • 如果是,那如何避免这个问题呢?我们如何确保在课堂设计中没有循环参考?是否有任何工具(或编译器选项)可帮助我们检测循环引用?
  • 如果没有,我们在哪里以及为什么使用WeakReference课堂?目的是什么?

阅读 254

收藏
2020-05-19

共1个答案

一尘不染

.Net垃圾收集器可以绝对处理循环引用。在 非常 的垃圾收集器是如何工作的高层次的看法是?

  • 从局部变量,静态变量和GC固定对象开始。这些都无法收集
  • 标记遍历这些对象的子对象可以到达的每个对象
  • 收集每个未标记的对象。

这样就可以很好地收集循环引用。只要从已知无法收集的对象都无法到达它们,则循环引用实质上是无关紧要的。

注意:我意识到我已经省略了许多有趣的细节,以使此答案简单直接

2020-05-19