【问题标题】:Will this application tree be garbage collected?这个应用程序树会被垃圾收集吗?
【发布时间】:2011-11-24 07:52:50
【问题描述】:

在我的应用程序组合根中,构建了一个大型实例树,其中子节点可以通过实例委托和观察者隐式引用父节点。这是托管对象关系的简化视图:

A    <---+
  B    | |
  C  - + |
  D      |
E        | <-+
  F  ----+   |
  G          |
    I -------+  

我的预感是,如果我在组合根中引用了对象 A 和 E,然后将它们设置为 null,那么完整的对象树将被垃圾回收。

正确吗?

【问题讨论】:

  • “引用了对象 A 和 B”——不应该是 A 和 E 吗?
  • @Henk:是的 - 谢谢你的收获!固定。

标签: c# garbage-collection clr


【解决方案1】:

这是正确的,因为您没有任何其他对树中节点的可达引用。这是因为如果没有对它们中的任何一个的外部(即可达)引用,则相互引用的不可访问对象仍然有资格进行垃圾回收。

【讨论】:

  • F --> A 呢?我不确定我是否正确理解了这个问题,但整个事情最终不是一组相互引用的对象吗?如果我的问题没有意义,请详细说明...
  • 是的,它是一组相互引用的对象。如果没有对它们中的任何一个的外部引用,即如果它们不可访问,则它们有资格进行垃圾收集。这是因为垃圾收集器使用滑动算法而不是引用计数算法。
  • 我明白你的意思。只是为了确保 F 没有提及它,对吗?或者另一个无法访问的对象正在引用它...
  • 另一个无法访问的对象可以引用它 - 这不会阻止垃圾收集
  • 这就是我的意思,谢谢你的澄清。我的意思是“F 没有任何引用它,或者它 确实 引用它但来自 unreachable 对象”。
猜你喜欢
  • 2019-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
相关资源
最近更新 更多