我正在学习 C# 中的垃圾收集。我了解到大会分三个阶段进行
- 打标
- 集会
- 压缩
在标记之前,建立一个链接图,其中根可以是局部变量,静态变量。此图中包含的所有对象都标记为已使用,并且它们不受垃圾回收的影响。您还可以区分活动根和非活动根的概念。
活动根是引用的对象,例如,从静态变量、本地变量。
非活动根- (更新)不可能有这样的事情。
所以我想知道非活动根是否正在被破坏?或者它可以被销毁但不是全部,例如,局部变量是,但静态不是。我是否正确绘制了所有内容(我特别遗漏了一些细节,例如世代,以免问题过多)?
例如,链接A
会发生什么?例如,如果没有对对象D的引用,它将被视为不可访问的对象并将被删除,但它不是根。
这里提出了一个类似的主题CLR 如何检查根和它们(根)所指的对象?

恕我直言,没有“非活动根”之类的东西,因为应用程序只有一个根。说“来自应用程序根的无法访问的对象”更正确。
静电未清除。仅在卸载域时才会清除静态数据。
系统资源也不会自动减去 => 如果您通过 WinAPI 从系统中获取了一些描述符,那么您必须返回它。否则,资源泄漏。
此外,固定结构阻止了局部变量的清理,这迫使垃圾收集器收集这些部分,因为程序员负责直接使用指针。
根是开始构建对象图的对象。
根只能是活动的,因为垃圾收集器不会构建非活动对象图。那些最后没有标记的都是不活跃的。
考虑一个具有静态属性的示例。
这
Foo.Bar是一个静态属性,它存储Bar对字符串Baz和所在对象的引用Qux。在垃圾收集期间,
Foo.Bar这是活动的根,所有可从它访问的对象都将被视为正在使用。让我们重置属性:
我们在内存中有一个对象
Bar,字符串Baz和Qux. 但是现在任何地方都没有指向它们的链接。下次垃圾收集器构建已使用对象的图时,它不会找到并标记它们。因此,收集器将清理所有三个对象占用的内存。重要的是要记住,此时对象的地址
Bar既没有存储在静态字段中,也没有存储在局部变量中。而且 - 根据定义 - 它不再是根。