首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > 说说.NET中的垃圾回收
【标  题】:说说.NET中的垃圾回收
【关键字】:.NET
【来  源】:http://blog.csdn.net/tiger119/archive/2006/08/27/1126331.aspx

说说.NET中的垃圾回收

    从技术角度上讲,垃圾回收无疑是最具神秘色彩的。以前都只闻其名,看了一下书,算是有了一些最基本的认识。
    下面列举一下俺从学习中总结出的几点:

    1:垃圾回收的用途,优势。
    这个,似乎不用多讲。但可能对于C++程序员,得说上两句。
    对于内存管理,C++程序员总是又爱又恨。爱来源于对能完全控制内存的自豪。恨是因为来无影去无踪的内存读写错误、内存泄漏。好了,C++程序的福音到了,.NET中,凡是拖管方式分配的内存。完全由系统回收,开发者无需理会。这实在是令人振奋不已。(嘿,慢着,这世界上从来没有免费的午餐,你当然会为此付出代价地)。

    2:垃圾回收的原理
    说到原理,不可能一两句话说清。偶只能简单描述一下,具体可自已去看MSDN资料。
    首先,托管代码为引用类型分配的内存在托管堆中,当托管堆到达一定满度(容量)时,执行垃圾收集算法。
    2.1:垃圾回收算法依赖于对源码编译时建立的对象/地址表,根据程序当前运行的执行点,进行智能判定,确定已无用的对象内存,进行收集,进行必要压缩,重新指定待分配内存在首地址。未收集的打上标记,提升级别。
    2.2:级别一般是三级。每级设置回收触发条件的不同阀值,达到阀值,开始收集。有资料将其称为代龄。注意:大尺寸的对象总被认为是最高代龄的对象(第2代)。
    2.3:对于回收对象,如果实现了Finalize,在收集前,会利用复苏机制,对其复苏,调用终止化方法,然后再回收。
    2.4:.NET支持弱引用机制,对于弱引用,垃圾回收有不同对待。弱引用主要用于特珠性况下的节省内存。
    令我感兴趣的是垃圾回收的算法,按照原理可以看出,在生存期内的对象也有可能被回收,这正是我前文说过的它的效率高于C++的原因之一。另外,由于内存成块,连续,它的收集的速度非常之快。

    3:垃圾回收的缺点 
    缺点?当然有,其实仔细一想就清楚,它什么时候回收?文件句柄,数据库连接等非托管资源怎么办?
    3.1:从它的原理,我们可以看出,垃圾回收的触发时间不确定。
    3.2:由于有了垃圾回收,对象的析构失去了原有的意义。.NET也不叫它为析构,而称为Finiaize(终止化,C#中的析构是假的,实际上是调用的Finialize,只有在垃圾回收的时候才会调用,和对象生命周期无关)。
    3.3:由于以上两点,对于稀缺的非托管资源,完全有可能长期被占用,而得不到释放。

    4:如何处理非托管资源 
    4.1:让用户自已去保证。这是Windows SDK编程的一贯做法,打开了文件,自已记得关哈。
   也就是提供显示的方法,让用户在合适的时候去调用。这样好吗?也不是行,但总觉得不甚好,粗心的程序员可能会忘了噢。
    4.2:.NET为开发者提供了一种模式来解决问题。
    很好,使用此模式,从此你头也不疼了,脖子也不会酸了。举一反三,你不用再记太多的规则,一切搞定,不亦乐乎。
    做法很简单,记住就行(偶就不抄书了,只写要点。哪里都能查到)。
    4.2.1:YourClass继承IDisposeable接口,实现Dispose方法。
    4.2.2:YourClass重写Finalize方法,直接调用Dispose。
    4.2.3:使用时,采用Try{  } Finally{ }方式,在Finally中调用Dispose。
    在C#中,也可用using语句替代之(实际上,内部就是将其编译为try Finally方式。
    4.2.4:相关注意事项:
    a:注意不要重复调用资源释放语句。
    b:注意进行线程同步,可简单的用lock(this)进行锁定。
    c:注意在Finalize时,不要引用YourClass中的引用对象,因为有可能已被终止化。
    d:注意在正常的Dispose调用(非Finialize触发)时,使用GC.SuppressFinalize(this)阻止垃圾回收器再次调用Finalize方法,以提高执行效率。
    对于以上事项,均有专门的写法支持。

    5:其它 
    5.1:垃圾回收时,所有执行托管代码的线程会被挂起。如果线程程序未执行到安全点,CLR劫持该线程。
    5.2:垃圾回收支持并发收集,但并发收集并不意味着更好的性能,在开发时可以通过测试性能进行选择。
    5.3:通过GC.Collect可以强行执行垃圾回收,并且可以指定级别。非特珠情况,没有十足的把握,不应该使用这种方式,因为可能会造成异想不到的低性能。
    5.4:.NET框架一书中,利用对象复苏写了一个对象池,很有意思。值得一看。

    垃圾回收扯完,扯得一点都不完整,有兴趣的同学可以到MSDN上去查找相关资料。

泛型中使用接口的显示实现:【上一篇】
偶与.NET的第一次接触:【下一篇】
【相关文章】
  • The Configuration API in .NET 2.0
  • 说说.NET中的反射
  • Asp.net 2.0 GridView数据导出Excel文件(示例代码下载)
  • AjaxPro.NET框架生成高效率的Tree(Asp.net 2.0)(示例代码下载)
  • asp.net 2.0 用户管理功能结构
  • ASP.NET 2.0 Membership
  • asp.net 2.0小TIPS两则
  • 通过N层架构提升.NET应用程序的性能
  • ASP.NET 常见参考项目的 UI、BLL 、Model 、 DAL 分析
  • ADO.NET中DataSet、DataTable、DataRow的数据复制方法
  • 【随机文章】
  • 内外网物理隔离下的集群邮件系统路由方案
  • diary Jan 28 2006
  • 一个用CLR写存储过程的项目回顾 (三) 心得总结
  • QQ连连看外挂 追风逐月版 代码更新
  • 菜鸟求解 (编程实现360阶扰动重力 )
  • Oracle数据库的备份方法-冷备份
  • 学习GNU Make (2): 规则
  • 设置 MySql 数据同步及故障处理
  • java学习中重写与重载方法的区别(转自:小鸟的天空)
  • awk(gawk)用法小结
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.