【发布时间】:2011-05-24 22:14:33
【问题描述】:
我担心两个对象相互引用的情况下的垃圾回收......
public class A
{ public readonly B _b;
public A()
{ _b = new B(this);
}
}
public class B
{ public readonly A _a;
public B(A objA)
{ _a = objA;
}
}
在这种情况下,第三类可能会引用A ...
public class Foo
{ public A _a = new A(); // A and B are both created here.
public void Bar()
{ _a = new A();
} // Create a new A (and B)
}
通常,垃圾收集器会处理不再具有任何活动引用的对象。但在这种情况下,A 和 B 对象永远不会丢失所有的活动引用,因为它们总是相互引用。
当Foo 对象用新的A(和B)替换当前的A(和B)时,垃圾收集器是否能够清理旧的A(和B) 没有使用循环对象引用启动无限循环?
这是一个严重的问题,因为它是一个 ASP.NET 应用程序。这些对象将在每个 Web 请求中创建多次,如果垃圾收集器无法清理它们,它们可能会一直持续到服务器重新启动。
可能的负面结果:
.NET 在这种场景下如何处理垃圾回收?
【问题讨论】:
-
您认为这是个问题吗?我认为垃圾收集器应该能够检测到原始的
A<->B是一个岛引用,并且都可以安全地删除。 -
“通常情况下,垃圾收集器......” - 不,它没有。 :)
标签: c# .net asp.net memory-leaks garbage-collection