公主笔记(快乐的蓝精灵)

在那山的那边海的那边有一群蓝精灵,她们活泼又聪明,她们调皮又灵敏!

用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
qin87的公告
<a href='http://www.alimama.com/membersvc/rd.do?w=p_10183015&p=&f=http://www.alimama.com/membersvc/promotion/tjyj.htm' target='_blank'><img border="0" src="http://img.alimama.cn/images/adzone/banner_180x250_tjyj.jpg" /></a> <a href='http://www.alimama.com/membersvc/rd.do?w=p_10183015&p=&f=http://www.alimama.com/membersvc/promotion/tjyj.htm' target='_blank'>阿里妈妈,帮你实现网络赚钱梦,流量变成现金!</a>
文章分类
朋友
3少
Carl
chenchao
oscar
收藏
lin_bei
存档

转载  自动内存管理机制深入剖析-C#分析篇 收藏

.NET Framework,内存中的资源(即所有二进制信息的集合)分为"托管资源""非托管资源".托管资源必须接受.NET FrameworkCLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET FrameworkCLR管理. (了解更多区别请参阅.NET FrameworkC#的高级编程资料)

托管资源在.NET Framework中又分别存放在两种地方: "堆栈""托管堆"(以下简称"");规则是,所有的值类型(包括引用和对象实例)和引用类型的引用都存放在"堆栈",而所有引用所代表的对象实例都保存在堆中.

C#,释放托管资源是可以自动通过"垃圾回收器"完成的(注意,"垃圾回收"机制是.NET Framework的特性,而不是C#),但具体来说,仍有些需要注意的地方:

1.值类型(包括引用和对象实例)和引用类型的引用其实是不需要什么"垃圾回收器"来释放内存的,因为当它们出了作用域后会自动释放所占内存(因为它们都保存在"堆栈",学过数据结构可知这是一种先进后出的结构);

2.只有引用类型的引用所指向的对象实例才保存在"",而堆因为是一个自由存储空间,所以它并没有像"堆栈"那样有生存期("堆栈"的元素弹出后就代表生存期结束,也就代表释放了内存),并且非常要注意的是,"垃圾回收器"只对这块区域起作用;

3."垃圾回收器"也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在""中的对象实例被删除中间有个间隔,为什么呢? 因为"垃圾回收器"的调用是比较消耗系统资源的,因此不可能经常被调用!

(当然,用户代码可以用方法System.GC.Collect()来强制执行"垃圾回收器")

然而,大多数情况下,我们需要明确地在不执行"垃圾回收器"的情况下释放托管资源(因为只需要释放一部分但又是非常需要释放的资源,但最好不要调用"垃圾回收器",因为"垃圾回收器"太浪费系统资源了),或需要释放"非托管资源",这时候我们该怎么办? 这是我们写代码的时候必须要考虑的问题("垃圾回收器"是系统自动实现的,一般情况不需要用户干预),

那就是使用类的Dispose()方法释放所有类型资源 使用析构方法释放非托管资源!

1.Dispose()方法

要通过Dispose()方法来释放资源,那么在类定义的时候执"System.IDisposable"接口,然后在类中必须包含这样定义的方法"void Dispose()" (Dispose()方法中就是用户自己写的释放资源的代码段),这样一来,用户就会知道可以通过人为地调用Dispose()方法来释放资源. 不过需要注意的是,"垃圾回收器"并不是通过调用Dispose()方法来释放托管资源的!

2.析构方法

C#中定义析构方法的格式是" ~CLASS_NAME() ".非常需要注意的是,如果一个类中没有使用到非托管资源,那么请一定不要定义析构方法,这是因为对象执行了析构方法,那么"垃圾回收器"在释放托管资源之前要先调用析构方法,然后第二次才真正释放托管资源,这样一来,两次删除动作的花销比一次大多的! (不过,即使你在类中已经定义了析构方法,仍然有办法"屏蔽",这将在后面的代码范例中说明) 在析构方法中,就是用户自己写的释放非托管资源的代码段.

发表于 @ 2009年02月18日 15:23:00 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:优化ASP.NET应用程序性能研究与探讨 | 新一篇:在.NET中的线程处理(1)

  • 发表评论
  • 评论内容:
  •  
Copyright © qin87
Powered by CSDN Blog