C#垃圾回收活动根

我正在阅读有关C#垃圾回收器的内容,以及CLR如何构建对象图。 该章节引用可能对该对象有效的不同根源:

•对全局对象的引用(虽然这些在C#中是不允许的,但CIL代码确实允许分配全局对象)
•对任何静态对象/静态字段的引用
•对应用程序代码库中的本地对象的引用
•对传入方法的对象参数的引用
•对等待完成的对象的引用(在本章后面介绍)
•任何引用对象的CPU寄存器

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

谢谢


假设您运行以下程序:

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();
    }
}

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

  • 一个由静态字段foo引用的Class1对象
  • 一个由参数args引用的string[]对象
  • args引用的string[]对象引用的零个或多个string对象
  • 本地变量bar引用的Class2对象
  • Class3对象有资格进行垃圾回收,可能已经被收集或正在等待敲定。

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


    class Test
        {
            static object ImARoot = new object(); //static objects/static fields
    
            void foo(object paramRoot) // parameters  I'm a root to but only when in foo
            {
                object ImARoot2 = new object(); //local objects but only when I'm in foo. 
    
                //I'm a root after foo ends but only because GC.SuppressFinalize is not called called (typically in Dispose)
                SomethingWithAFinalizer finalizedRoot = new SomethingWithAFinalizer (); 
    
    
            }
        }
    

    如果你想知道某个对象在某个特定位置的根源,可以使用SOS(在Visual Studio 2005或更高版本或WinDbg中)并使用!gcroot命令。

    链接地址: http://www.djcxy.com/p/19883.html

    上一篇: C# Garbage Collection Active Roots

    下一篇: How does the new automatic reference counting mechanism work?