.net C#垃圾收集器交叉引用

.net C#垃圾收集器交叉引用,.net,garbage-collection,.net,Garbage Collection,垃圾收集器将释放交叉引用对象/类的资源,该对象/类不再从主程序引用。 比如说- class class1 { class2 m_RefClass2; } class class2 { class1 m_RefClass1; } class class3 { public class3() { class1 obj1 = new class1(); class2 obj2 = new class2(); obj1.m

垃圾收集器将释放交叉引用对象/类的资源,该对象/类不再从主程序引用。 比如说-

class class1
{
    class2 m_RefClass2;
}
class class2
{
    class1 m_RefClass1;
}

class class3
{
    public class3()
    {
        class1 obj1 = new class1();
        class2 obj2 = new class2();
        obj1.m_RefClass2 = obj2;
        obj2.m_RefClass1 = obj1;
    }
}

对。NET垃圾收集器并不是简单地计算引用(在这种情况下,这样的安排将导致两个类保持彼此的活动状态)。任何不是“根对象”的对象(意味着没有从GC根对象指向该对象的引用路径)都有资格收集。

如果每次听到这个消息我都有一枚硬币!THNX!还有一件事-GC什么时候决定释放这些资源?这是偶然发生的还是罕见的(比如关闭程序时?)@0xDEAD BEEF:这是不可能确定的,也可能永远不会发生。您可以自己调用
GC.Collect
,但不要。让GC担心什么时候收集内存。@0xDEAD BEEF:当GC认为应该收集内存时,就会发生这种情况。当它发生的时候,它“一块一块”地发生,而不是一次完成所有的事情。通常,GC在猜测何时应该运行方面比大多数程序员做得更好,所以请让GC在空闲时运行。还有一个问题:)比如说,a类指的是b类,b类指的是c类等等。GC如何知道是否应该释放类Z?它会在引用树中上升到类a,以发现它是全局引用的吗?如果是这样的话,这不是在浪费时间吗?还有一个问题-弱引用是如何工作的。简单地说,当GC释放一些资源时,它是否会以某种方式迭代所有弱引用并将其置空?这被称为“循环引用”,谷歌很好地做到了这一点。首击: