.Net:嵌套引用

时间:2009-03-31 16:54:12

标签: .net oop reference

嵌套引用的垃圾收集有多聪明?

以此代码为例:

Public Class SomeClass
    Private m_SomeOtherClass(Me)
End Class

我知道GC的工作原理是查看剩余的引用数量,并且任何没有任何引用的对象最终都会被转储。所以在这种情况下,有来自成员变量的引用,是否等待发生内存泄漏(除非你实现IDisposable等)?

现在我假设GC足够智能,因为它可能会检查是否有任何引用来自对象本身,而不是将它们计入引用计数。但我想我会挖一点。

3 个答案:

答案 0 :(得分:4)

绝对没问题。 GC从一组根(本地和静态变量等)工作,并找到它可以的所有引用。如果没有别的东西引用这个相互引用的对象,它就有资格收集。

答案 1 :(得分:1)

GC非常聪明。如果它们在时间和空间维度上彼此足够接近地分配,它甚至可以同时收集两个对象;)

答案 2 :(得分:1)

基本答案:这不是问题。

之前我听过这样的问题,它源于与引用计数的混淆,其中循环引用确实存在问题。

.NET收集器不计算引用,它只扫描和标记引用的对象。这些标志也阻止它进入循环。这是一个非常简单且几乎万无一失的机制。系统不需要计算或跟踪入站引用,因此短期引用的开销为零。但是你必须留意引用存在的位置,常见的问题是订阅事件的对象。该事件保留了引用,因此您需要在订阅对象可以回收之前取消订阅。 GC的另一个好处是逻辑也可以反向运行:只要您的代码有权访问引用,保证引用有效,只需要存在该引用。

引用计数要求编译器每次更改,复制或超出范围时都会注入代码,从而产生持续的开销。当计数降至零时,可以立即销毁对象。系统需要一种机制来(手动)处理循环。您可以通过搜索COM IUnknown界面找到一些恐怖故事。