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

ASP.NET
VS2008SP1下jQuery使用初体验
使用asp.net 2.0中的SqlBulkCopy类批量复制数据
asp.net定点执行任务总结
通过webBrowser 来轻松模拟网页来源
ASP.NET框架 数据回发与事件回发
浅谈ASP.NET内部机制
通用语言规范
GC垃圾回收
ASP.NET 配置
ASP.NET 安全认证
ASP.NET生成复合控件
asp.net中forms验证
DataTable中数据记录的统计
关于无aspx文件部署,我的一些探索心得
ASP.NET刷新页面的六种方法
ASP.NET MVC应用程序的本地化、单元测试
详解ASP.NET的四种状态
.NET与Java间进行Web Service交互的选择
自己动手实现Asp.net的MVC框架
ASP.net中网站访问量统计方法

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 872 ::
收藏到网摘: 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)其他情况,例如物理内存不足,超出短期存活代的内存段门限,运行主机拒绝分配内存等等。