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?