浅谈.NET垃圾回收机制(GC)

 

.NET自动内存管理将开发人员从内存错误的泥潭中解放出来,这一切都归功于垃圾回收(GCGarbage Collection)机制。 通过对对象创建全过程的讲述,我们理解了CLR执行对象内存分配的基本面貌。一个分配了内存空间和完成初始化的对象实例,就是一个CLR世界中的新生命体,其生命周期大概可以概括为:对象在系统中进行一定的操作和应用,到一定阶段它将不被系统中任何对象引用或操作,则表示该对象不会再被使用。因此,对象符合了可以销毁的条件,而CLR可能不会马上执行销毁操作,而是在适当的时间执行该对象的内存销毁。一旦被执行销毁,对象及其成员将不可在运行时使用,最后由垃圾收集器释放其内存资源,完成一个对象由生而灭的全过程。

什么样的对象被GC认为是垃圾呢?

 简单地说,一个对象成为“垃圾”就表示该对象不被任何其他对象所引用。因此,GC必须采用一定的算法在托管堆中遍历所有对象,最终形成一个可达对象图,而不可达的对象将成为被释放的垃圾对象等待收集。

如何回收?

每个应用程序有一组根(指针),根指向托管堆中的存储位置,由JIT编译器和CLR运行时维护根指针列表,主要包括全局变量、静态变量、局部变量和寄存器指针等。

下面以一个简单的示例来说明,GC执行垃圾收集的具体过程。

class A { private B objB; public A(B o) { objB = o; } A() { Console.WriteLine("Destory A."); }

} class B { private C objC; public B(C o) { objC = o; } B() { Console.WriteLine("Destory B."); } } class C { C() { Console.WriteLine("Destory C."); } } public class Test_GCRun { public static void Main() { A a = new A(new B(new C())); //强制执行垃圾回收 GC.Collect(0); GC.WaitForPendingFinalizers(); } }

何时回收?

垃圾收集器周期性的执行内存清理工作,一般在以下情况出现时垃圾收集器将会启动:

1)内存不足溢出时,更确切地应该说是第0代对象充满时。

2)调用GC.Collect方法强制执行垃圾回收。

3Windows报告内存不足时,CLR将强制执行垃圾回收。

4CLR卸载AppDomain时,GC将对所有代龄的对象执行垃圾回收。

5)其他情况,例如物理内存不足,超出短期存活代的内存段门限,运行主机拒绝分配内存等等。

 

你可能感兴趣的:(文章发布在程序员之家,.net,class,编译器,windows,算法,c)