C++的许多程序员都中,最头疼的是对内存的分配和管理。用.net就不一样了。.net引用了垃圾回收(GC)功能,它替代了程序员对于清除无用对象的工作。虽然在大多数情况下,内存的回收我们不用再去理会,但如果能够在程序中适时地添加一些内存管理的工作,可以使程序更加的优化,来看看CLR内存管理机制 。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站制作、鹤山网络推广、小程序设计、鹤山网络营销、鹤山企业策划、鹤山品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供鹤山建站搭建服务,24小时服务热线:13518219792,官方网址:www.cdcxhl.com
由于CLR(公共语言运行时)可以知道在系统中的所有对象引用,而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等的实例也可以实现这种方式来清除对象。以上就是CLR内存管理学会了吗?
【编辑推荐】
当前标题:深入挖掘CLR内存管理机制原理
网站URL:http://www.shufengxianlan.com/qtweb/news22/505972.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联