代码之家  ›  专栏  ›  技术社区  ›  Brian MacKay

.Net:嵌套引用

  •  0
  • Brian MacKay  · 技术社区  · 16 年前

    对于嵌套引用,垃圾收集有多聪明?

    Public Class SomeClass
        Private m_SomeOtherClass(Me)
    End Class
    

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

    3 回复  |  直到 16 年前
        1
  •  4
  •   Jon Skeet    16 年前

    绝对没问题。GC从一组根(局部变量和静态变量等)开始工作,并查找它所能找到的所有引用。如果没有其他对象引用此相互引用的对象,则该对象将符合收集条件。

        2
  •  1
  •   grover    16 年前

    GC足够聪明。如果两个对象在时间和空间维度上分配得足够近,它甚至会同时收集这两个对象;)

        3
  •  1
  •   Henk Holterman    16 年前

    基本答案:这不是问题。

    我以前听过这种问题,它源于对引用计数的混淆,循环引用确实会带来问题。

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

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