深入挖掘CLR内存管理机制原理
创始人
2024-06-09 11:41:01
0

C++的许多程序员都中,最头疼的是对内存的分配和管理。用.net就不一样了。.net引用了垃圾回收(GC)功能,它替代了程序员对于清除无用对象的工作。虽然在大多数情况下,内存的回收我们不用再去理会,但如果能够在程序中适时地添加一些内存管理的工作,可以使程序更加的优化,来看看CLR内存管理机制 。

由于CLR(公共语言运行时)可以知道在系统中的所有对象引用,而CLR内存管理机制在运行时,GC可以获取对象是否被引用的信息。如果一个对象不再被引用,则通过GC进行自动回收。
不过GC回收的条件是,当特定资源不够用时才执行。如果我们希望自己控制,也可以显示地指示GC工作。方法是:

  1. System.GC.Collect(); 

GC在进行回收时,先会识别对象是否被引用,并标记出对象的特征。只有不被引用的对象才被回收。为避免堆碎片,GC在回收了对象后,会重新分配内存,并对未被回收的对象进行重定位。这必然导致GC在回收时会导致系统运行性能的降低。

适时的进行人工干预内存分配,是比较好的选择。我们知道在C++中,对于创建的类中,有相对应的析构函数进行内存的删除。在C#中,也可以采用同样的方式。当实例化一个类对象后,删除它,则自动调用其析构函数。CLR提供了对象终结(object finalization)的机制,引入了Finalize方法。不过在C#中,不能直接实现Finalize方法,而是在析构函数中调用基类的Finalize()方法。

GC的回收机制是异步操作,我们可以使用CLR提供的Dispose()方法实现对每一个对象的删除操作。Dispose()方法由IDiposable接口提供。因此对于将要实例化的类对象,实现Dispose操作,必须使类实现该接口,并提供Dispose()方法。

  1. public class Garbage:IDisposable//实现该接口  
  2. {  
  3. public void Dispose()//提供Dispose()方法;  
  4. {  
  5. GC.SuppressFinalize(this);//回收该对象;  
  6. }  
  7. ~Garbage()//析构函数;  
  8. {  
  9. Dispose();  
  10. }  
  11. }  


不过更好的方案是使用using语句。将对象的实例放到using中,一旦using结束,系统会自动清楚该对象。

  1. using (Garbage g = new Garbage())  
  2. {  
  3. //执行操作;  

不过要注意的是在using语句中实例的对象,其类也必须要实现IDisposable接口和Dispose()方法。另外,由于IComponent扩展了IDisposable,因此IComponent类型始终是IDisposable类型。所以我们开发的组件类型可以用在using中,或者使用Dispose()方法。所以,系统提供的组件如DataSet,DataTable等的实例也可以实现这种方式来清除对象。以上就是CLR内存管理学会了吗?

【编辑推荐】

  1. 全面概括SQL SERVER调用CLR类库实现步骤
  2. CLR函数压缩NTEXT类型字段实例讲解
  3. CLR函数实现字符串排序七步通
  4. CLR线程池教程四大功能详解
  5. 全面解析CLR是什么一点通

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...