C#垃圾收集活跃根

Ben*_*ale 7 c# clr garbage-collection memory-management

我正在阅读C#垃圾收集器,以及CLR如何构建对象图.本章引用了可以为对象激活的不同根:

•对全局对象的引用(尽管C#中不允许这样做,但CIL代码允许分配全局对象)
•对任何静态对象/静态字段的
引用•对应用程序代码库中本地对象的
引用•对传递给对象参数的对象参数的引用方法
•对等待完成的对象的引用(本章稍后介绍)
•任何引用对象的CPU寄存器

我想知道是否有人可以在代码中提供这些根的例子?

谢谢

dtb*_*dtb 7

假设您运行以下程序:

class Program
{
    static Class1 foo = new Class1();

    static void Main(string[] args)
    {
        Class2 bar = new Class2();

        Class3 baz = new Class3();
        baz = null;

        Debugger.Break();

        bar.Run();
    }
}
Run Code Online (Sandbox Code Playgroud)

当程序进入调试器时,由于以下引用,有3个以上的对象不符合垃圾回收的条件:

  • Class1静态字段引用的对象foo
  • string[]参数引用的对象args
  • string引用的string[]对象引用的零个或多个对象args
  • Class2局部变量引用的对象bar

Class3对象有资格进行垃圾收集,可能已经收集或等待最终确定.

C#中不允许引用全局对象.CPU寄存器中的引用是VM的实现细节.

  • 此时`bar`实际上可能有资格在发布模式下收集,因为它在休息后没有被引用. (3认同)