分层数据和GC

问题描述

我们有一个层次结构,其中该结构的每个子节点都引用根节点和父节点,并且还具有一个子节点列表。

类似这样的东西:

public class Node
{
     private readonly Node _root;
     private readonly Node _parent;
     private readonly IList<Node> _items;

     public Node(Node root,Node parent)
     {
         _root = root;
         _parent = parent;
         _items = new List<Node>();
     }

     public IList<Node> Items
     {
         get { return _items; }
     }
}

...这:

class Tree
{
   // Root node is readonly
   readonly Node _root = new Node(null,null);

   public void ClearandFill()
   {
      // Before creating a new tree,delete the existing child items
      _root.Items.Clear();

      var subNode1 = new Node(_root,_root);

      var subNode1_1 = new Node(_root,subNode1);
      subNode1.Items.Add(subNode1_1);

      var subNode2 = new Node(_root,_root);

      var subNode2_1 = new Node(_root,subNode2);
      subNode1.Items.Add(subNode2_1);

      _root.Items.Add(subNode1);
      _root.Items.Add(subNode2);
   }
}

我的问题是:如果我们多次调用ClearandFill方法,是否会发生内存泄漏,或者GC会收集所有超出范围的节点?

谢谢。

解决方法

将收集未被任何根引用的任何对象(全局/静态变量,由这些变量的成员指向的任何对象,或者在GC启动时所有线程中的临时堆栈变量)。>

.NET垃圾收集器是mark-and-sweep collector,因此无法访问的对象将不会被标记,因此将被收集。