当前位置: 首页 > 图文教程 > .Net技术 > ASP.NET > ASP.NET:浅谈.NET垃圾回收机制(GC)

ASP.NET
ASP.NET:小编教你使用Substitution控件在缓存页面插入内容
ASP.NET:网络上实现单点登录
ASP.NET:小编浅谈泛型的使用
ASP.NET:网络验证的一些技巧杂谈
ASP.NET:小编教你实现数字和英文字母组合的验证码图片
ASP.NET:页面尺寸自动适应 1024*768和800*600分辨率
ASP.NET:如何复制数组中一系列元素的元素
ASP.NET:小编谈用Remoting技术传送文件

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 873 ::
收藏到网摘: n/a

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

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

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

如何回收?

下面以一个简单的示例来说明,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)其他情况,例如物理内存不足,超出短期存活代的内存段门限,运行主机拒绝分配内存等等。