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

开发 后端
.NET Framework内存机制的了解对于初学者来说可能并不是很容易把握。我们会在文章中对.NET Framework内存机制的相关处理方法进行详细介绍。

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

在.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系统会因为内存耗尽而...

责任编辑:曹凯 来源: 博客园
相关推荐

2009-08-26 14:52:19

.NET Framew

2010-01-06 18:59:41

.Net Framew

2010-01-06 17:20:38

.Net Framew

2010-01-06 10:23:47

.NET Framew

2009-12-15 11:28:34

.NET Framew

2010-01-06 16:45:42

.Net Framew

2010-01-06 16:33:50

.Net Framew

2010-01-06 19:18:22

.NET Framew

2010-01-06 18:13:58

.NET Framew

2010-01-05 17:39:10

.NET Framew

2010-01-06 13:50:37

.NET Framew

2010-01-05 16:10:21

.NET Framew

2022-08-26 07:33:49

内存JVMEntry

2010-07-23 09:34:48

Python

2010-01-05 18:14:17

.NET Framew

2010-01-06 10:36:00

.NET Framew

2010-01-06 16:25:58

.Net Framew

2009-12-14 10:19:23

.NET Framew

2010-01-06 15:35:01

.Net Framew

2012-03-31 10:59:02

ASP.NET
点赞
收藏

51CTO技术栈公众号