具有循环引用的实例的垃圾收集
Garbage collection of a instances with circular reference
我知道当一个对象没有引用时,垃圾收集器会释放内存。但是我有个疑问。
我有一个用树表示的class:
class MyNode
{
string Name;
List<MyNode> Descendants;
MyNode Parent;
}
当我创建一个有后代的节点时,我有对该节点的引用,而且儿子也有对父节点中节点的引用 属性。此外,该节点还引用了后代列表中的后代。
举个例子。
Node myNode = new Node();
Node myDescendant = new Node();
myNode.Descendants.Add(myDescendant);
myDescendant.Parent = myNode;
我可以删除对 myNode
的引用,将其设置为 null
。但是,该对象仍然被引用,因为 myDescendant
在 Parent
属性 中引用了它。 myDescendant
对象未被重新收集,因为在节点对象的后代列表中被引用。
所以好像有一个避免节点回收的循环。这是真的?也许我需要将节点和后代中的所有属性设置为 null
并清除后代列表?
非常感谢。
仅当没有可从根位置访问的引用时才收集对象。根位置是 "in scope" 贯穿整个应用程序生命周期的位置,例如静态变量、堆栈等
由于这些对象具有循环引用,如果它们中的任何一个都可以通过有根引用访问(局部变量、静态变量或任何可通过另一系列引用访问的任何东西 link 返回有根引用参考),那么它们都不符合垃圾收集的条件。如果两个对象都不能从有根引用访问,则两个对象都符合垃圾回收条件。
我知道当一个对象没有引用时,垃圾收集器会释放内存。但是我有个疑问。
我有一个用树表示的class:
class MyNode
{
string Name;
List<MyNode> Descendants;
MyNode Parent;
}
当我创建一个有后代的节点时,我有对该节点的引用,而且儿子也有对父节点中节点的引用 属性。此外,该节点还引用了后代列表中的后代。
举个例子。
Node myNode = new Node();
Node myDescendant = new Node();
myNode.Descendants.Add(myDescendant);
myDescendant.Parent = myNode;
我可以删除对 myNode
的引用,将其设置为 null
。但是,该对象仍然被引用,因为 myDescendant
在 Parent
属性 中引用了它。 myDescendant
对象未被重新收集,因为在节点对象的后代列表中被引用。
所以好像有一个避免节点回收的循环。这是真的?也许我需要将节点和后代中的所有属性设置为 null
并清除后代列表?
非常感谢。
仅当没有可从根位置访问的引用时才收集对象。根位置是 "in scope" 贯穿整个应用程序生命周期的位置,例如静态变量、堆栈等
由于这些对象具有循环引用,如果它们中的任何一个都可以通过有根引用访问(局部变量、静态变量或任何可通过另一系列引用访问的任何东西 link 返回有根引用参考),那么它们都不符合垃圾收集的条件。如果两个对象都不能从有根引用访问,则两个对象都符合垃圾回收条件。