【发布时间】:2013-05-11 19:23:33
【问题描述】:
假设我有 2 个对象 - 对象 A 和对象 B。对象 A 引用对象 B,对象 B 引用对象 A。
- 如果对象 A 和对象 B 都超出了代码的引用范围 - 垃圾收集器如何知道它可以被收集。
- 垃圾收集器如何推断任何对象超出范围/已准备好进行垃圾收集?
- 如果我们的代码没有引用对象 A 但仍然可以独立,那该怎么办?例如。如果它是一个 Form 类,那么即使对象 A 重新初始化为新实例或指定为 null,它也可以自行运行。
【问题讨论】:
-
您应该阅读以下内容:msdn.microsoft.com/en-us/library/ee787088.aspx 它回答了您的问题等等。 (粗略地说:GC 有一个它知道是活动的东西的列表(静态引用、堆栈变量等),它们是“根”。通过从这些根开始遍历引用可以到达的任何其他对象也被认为是活动的。任何不能被认为有资格收集的对象。)
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
如果你对这类东西感兴趣,绝对最好的书 (IMO) 是CLR Via C#(这是第 4 版,并且有关于垃圾收集器的最新更新部分)。我不能高度推荐它。它确实很好地解释了 CLR 中发生的事情。
标签: c# .net garbage-collection clr