.NET Framework内存机制具体含义详细解读

日期: 2010-01-10 作者:博客园 来源:TechTarget中国 英文

    .NET Framework可以说是一个非常实用的开发环境。它的存在就是为了让开发人员获得一个轻松的开发环境 。在这里我们先来了解一下有关.NET Framework内存机制的相关概念。希望对大家有所帮助。

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

  .NET Framework内存机制深入剖析:

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

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

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

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

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

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

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

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 微软开放.NET Framework 4.5.1源代码

    .NET Reference Source发布了beta版,可以在线浏览.NET Framework 4.5.1的源代码,并且可以通过配置,在Visual Studio 2013中调试.NET Framework。

  • .NET 4.5.1比看上去更丰富

    本周的Build大会上宣布了.NET 4.5.1的推出。看上去这次更新好像只是一次bug fix,或者顶多包括一些很小的更新。