第七章 NET垃圾回收机制.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
NET垃圾回收机制.txt12思念是一首诗,让你在普通的日子里读出韵律来;思念是一阵雨,让你在枯燥的日子里湿润起来;思念是一片阳光,让你的阴郁的日子里明朗起来。在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为托管资源和非托管资源.托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理. (了解更多区别请参阅.NET Framework或C#的高级编程资料) 托管资源在.NET Framework中又分别存放在两种地方: 堆栈和托管堆(以下简称堆);规则是,所有的值类型(包括引用和对象实例)和引用类型的引用都存放在堆栈中,而所有引用所代表的对象实例都保存在堆中。 在.NET中,释放托管资源是可以自动通过垃圾回收器完成的(注意,垃圾回收机制是.NET Framework的特性,而不是C#的),但具体来说,仍有些需要注意的地方: 1.值类型和引用类型的引用其实是不需要什么垃圾回收器来释放内存的,因为当它们出了作用域后会自动释放所占内存(因为它们都保存在堆栈中,学过数据结构可知这是一种先进后出的结构); 2.只有引用类型的引用所指向的对象实例才保存在堆中,而堆因为是一个自由存储空间,所以它并没有像堆栈那样有生存期(堆栈的元素弹出后就代 表生存期结束,也就代表释放了内存),并且非常要注意的是,垃圾回收器只对这块区域起作用; 3.垃圾回收器也许并不像许多人想象的一样会立即执行(当堆中的资源需要释放时),而是在引用类型的引用被删除和它在堆中的对象实例被删除中间有 个间隔,为什么呢? 因为垃圾回收器的调用是比较消耗系统资源的,因此不可能经常被调用; (当然,用户代码可以用方法System.GC.Collect()来强制执行垃圾回收器) 4.有析构函数的对象需要垃圾收集器两次处理才能删除:第一次调用析构函数时,没有删除对象,第二次调用才真正删除对象; 5.由于垃圾收集器的工作方式,无法确定C#对象的析构函数何时执行; 6.可实现IDisposable接口的Dispose()来显示释放由对象使用的所有未托管资源; 7.垃圾收集器在释放了它能释放的所有对象后,就会压缩其他对象,把他们都移动回托管堆的端部,再次形成一个连续的块。 导言 垃圾回收(Garbage Collection)在.net中是一个很重要的机制。本文将要谈到CLR4.0对垃圾回收做了哪些改进。为了更好地理解这些改进, 本文也要介绍垃圾回收的历史。这样我们对整个垃圾回收有一个大的印象。这个大印象对于我们掌握.net架构是有帮助的。 关于垃圾回收 在C++时代,我们需要自己来管理申请内存和释放内存. 于是有了new, delete关键字. 还有的一些内存申请和释放函数(malloc/free)。C++程序必须很好地管理自己的内存,不然就会造成内存泄漏(Memory leak)。在.net时代, 微软为开发人员提供了一个强有力的机制--垃圾回收,垃圾回收机制是CLR的一部分, 我们不用操心内存何时释放,我们可以花更多精力关注应用程序的业务逻辑。CLR里面的垃圾回收机制用一定的算法判断某些内存程序不再使用,回收这些内存并交给我们的程序再使用. 垃圾回收的功能 用来管理托管资源和非托管资源所占用的内存分配和释放。 寻找不再使用的对象,释放其占用的内存, 以及释放非托管资源所占用的内存。 垃圾回收器释放内存之后, 出现了内存碎片, 垃圾回收器移动一些对象,以得到整块的内存,同时所有的对象引用都将被调整为指向对象新的存储位置。 下面我们来看看CLR是如何管理托管资源的。 托管堆和托管栈 .net CLR在运行我们的程序时,在内存中开辟了两块地方作不同的用处--托管栈和托管堆. 托管栈用来存放局部变量, 跟踪程序调用与返回。托管堆用来存放引用类型。引用类型总是存放于托管堆。值类型通常是放在托管栈上面的. 如果一个值类型是一个引用类型的一部分,则此值类型随该引用类型存放于托管堆中。哪些东西是值类型? 就是定义于System.ValueType之下的这些类型: bool byte char decimal double enum float int long sbyte short struct uint ulong ushort 什么是引用类型呢? 只要用class, interface, delegate, object, string声明的类型, 就是引用类型。 我们定义一个局部变量, 其类型是引用类型。当我们给它赋一个值,如下例: private void MyMethod() {

文档评论(0)

xiaofei2001128 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档