CLR中之内存管理

于C++中,令程序员最头疼的凡对准内存的分配和保管。在.net下,事情容易多矣。.net引用了排泄物回收(GC)功能,它替了程序员对于清除无用对象的做事。虽然当大多数状下,内存的回收我们毫不还去理,但若是会以先后中及时地抬高一些内存管理之做事,可以使程序更加的优化。

是因为CLR(公共语言运行时)可以解当系受的富有目标引用,因此在运转时,GC可以取对象是不是被引述的音。如果一个对象不再吃引述,则经过GC进行活动回收。

唯独GC回收的尺码是,当特定资源不够用时才行。如果我们期望团结说了算,也得展示地指示GC工作。方法是:

System.GC.Collect();

GC在进行回收时,先会识别对象是不是为引用,并记出目标的性状。只有不吃引用的目标才于回收。为免堆碎片,GC在回收了目标后,会重新分配内存,并对准莫受回收的对象进行再一贯。这自然造成GC在回收时会导致系统运行性能的低落。

及时的进行人工干预内存分配,是比较好之选取。我们掌握在C++中,对于开创的类吃,有相对应之析构函数进行内存的勾。在C#遭受,也得使同样的法子。当实例化一个类似对象后,删除其,则自动调用其析构函数。CLR提供了靶了(object
finalization)的机制,引入了Finalize方法。不过当C#着,不能够直接促成Finalize方法,而是于析构函数惨遭调用基类的Finalize()方法。

GC的回收机制是异步操作,我们得利用CLR提供的Dispose()方法实现对各级一个目标的删减操作。Dispose()方法由IDiposable接口提供。因此于即将实例化的近乎对象,实现Dispose操作,必须要类似实现该接口,并提供Dispose()方法。

public class Garbage:IDisposable//实现该接口
{
   public void Dispose()//提供Dispose()方法;
   {
       GC.SuppressFinalize(this);//回收该对象;
   }

   ~Garbage()//析构函数;
   {
       Dispose();
   }
}

唯独再好之方案是以using语句。将对象的实例放到using中,一旦using结束,系统会自行清楚该目标。

using (Garbage g = new Garbage())
{
    //执行操作;
}

然只要注意的是于using语句被实例的靶子,其类为必须使落实IDisposable接口和Dispose()方法。
另外,由于IComponent扩展了IDisposable,因此IComponent类型始终是IDisposable类型。所以我们出的零部件类型可以就此当using中,或者使用Dispose()方法。所以,系统提供的组件如DataSet,DataTable等之实例也堪实现这种方法来打消对象。

参考MSDN和.Net本质论