控件中国网现已改版,您看到的是老版本网站的镜像,系统正在为您跳转到新网站首页,请稍候.......
中国最专业的商业控件资讯网产品咨询电话:023-67870900 023-67871946
产品咨询EMAIL:SALES@COMPONENTCN.COM

.NET垃圾收集关键方法解析

作者:佚名 出处:互联网 2010年03月30日 阅读:

 文章通过分析.NET垃圾收集中的重要方法,让大家更加了解.Net GC的运行机制,相信大家通过本文,能够很全面的了解.NET GC方面的知识。
  1.Dispose()方法

  Dispose可用于释放所有资源,包括托管的和非托管的,需要自己实现。大多数的非托管资源都要求手动释放,我们应当为释放非托管资源公开一个方法,实现释放非托管资源的方法有很多种,实现IDispose接口的Dispose方法是最好的,这可以给使用你类库的程序员以明确的说明,让他们知道怎样释放你的资源;而且C#中用到的using语句快,也是在离开语句块时自动调用Dispose方法。

  这里需要注意的是,如果基类实现了IDispose接口,那么它的派生类也必须实现自己的IDispose,并在其Dispose方法中调用基类中Dispose方法。只有这样的才能保证当你使用派生类实例后,释放资源时,连同基类中的非托管资源一起释放掉。

  使用using与try+finally的区别

  可以说二者没有任何区别,因为using只是编辑器级的优化,它与try+finally有着相同的作用,以下是一段使用using的代码,它在IL阶段也是以try+finally呈现的,但是,using的优点是,在代码离开using块时,using会自动调用Idispose接口的Dispose()方法。


public partial class _Default : System.Web.UI.Page   
{       
protected void Page_Load(object sender, EventArgs e)    
{    
using (DataSet ds = new DataSet())   
{    
 }   
}   

 

.method family hidebysig instance void  Page_Load(object sender,class [mscorlib]System.EventArgs e) cil managed   
{   
    // 代码大小       29 (0x1d)   
    .maxstack  2   
    .locals init ([0] class [System.Data]System.Data.DataSet ds,   
             [1] bool CS$4$0000)   
    IL_0000:  nop   
    IL_0001:  newobj     instance void [System.Data]System.Data.DataSet::.ctor()   
    IL_0006:  stloc.0   
    .try   
    {   
      IL_0007:  nop   
      IL_0008:  nop   
      IL_0009:  leave.s    IL_001b   
    }  // end .try   
    finally   
    {   
      IL_000b:  ldloc.0   
      IL_000c:  ldnull   
      IL_000d:  ceq   
      IL_000f:  stloc.1   
      IL_0010:  ldloc.1   
      IL_0011:  brtrue.s   IL_001a   
      IL_0013:  ldloc.0   
      IL_0014:  callvirt   instance void [mscorlib]System.IDisposable::Dispose()   
      IL_0019:  nop   
      IL_001a:  endfinally   
    }  // end handler   
    IL_001b:  nop   
    IL_001c:  ret   
} // end of method _Default::Page_Load 


  2. GC.Collect()方法

  如果我们在程序中显式的调用了垃圾收集器的collect接口,那么垃圾收集器会立即运行,完成内存对象的标记、压缩与清除工作,使用GC.Collect(i)还可以指定回收的代,然而aicken并不赞成各位同学显式调用它:

  (1)GC.Collect()做的并不只是回收内存,就像第一节中介绍的,在回收了内存之后,GC会重新整理内存,修正对象指针,让空闲内存连续,供CLR顺序分配内存,提高新建对象的效率。内存压缩整理工作非常耗用计算资源。

  (2)很少有人会关心到GC除了在内存吃紧以及资源空闲时运行,还会在什么时候运行。 其实GC的运行时机,还要受到一个叫做“策略引擎”的部件控制,它会观察GC的收集频率、效率等等。它会根据GC回收效果,调整GC运行的频率:即当某次GC回收效果颇丰时,它便会增加GC运行的频率,反之亦然。

  所以如果刚刚发生了一次自然的收集,垃圾对象就会非常之少,而此时程序又显式的进行了收集调用,那么自然, GC虽然小有收获,但是策略引擎就会认为:这很不值得,才收集了这么点垃圾,也许该减少GC的次数。这样一来,垃圾收集器努力保持的自然节奏就被打乱了,同时,对象类型的创建效率与频率,也会被“策略引擎”捕捉到,从而改变代的数量与容量。

  所以,额外的调用GC,代价高昂,甚至会降低效率。显示的调用GC.Collect(),实质是在用“时间换空间”,而通常在程序设计中,我们推荐的设计原则是“空间换时间”,比如使用各种各样的缓存,也有例外,如果你掌握了整个应用程序的情况,明确的知道何时会产生大量垃圾,也是可以显示调用该方法的。综上,尽量不要显示调用GC.Collect(),因为服务器的CPU比内存要贵的多!

 

热推产品

  • ActiveReport... 强大的.NET报表设计、浏览、打印、转换控件,可以同时用于WindowsForms谀坔攀戀Forms平台下......
  • AnyChart AnyChart使你可以创建出绚丽的交互式的Flash和HTML5的图表和仪表控件。可以用于仪表盘的创......
首页 | 新闻中心 | 产品中心 | 技术文档 | 友情连接 | 关于磐岩 | 技术支持中心 | 联系我们 | 帮助中心 Copyright-2006 ComponentCN.com all rights reserved.重庆磐岩科技有限公司(控件中国网) 版权所有 电话:023 - 67870900 传真:023 - 67870270 产品咨询:sales@componentcn.com 渝ICP备12000264号 法律顾问:元炳律师事务所 重庆市江北区塔坪36号维丰创意绿苑A座28-5 邮编:400020
在线客服
在线客服系统
在线客服
在线客服系统