说说.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上去查找相关资料。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值