.NET依托CLR进行的内存的管理
看了http://www.cnblogs.com/liulun/p/3145351.html 不错,补习下相关技术。。
正文: .NET依托CLR进行的内存的管理
有了CLR 基本不需要担心.net程序的内存管理,他负责了内存的分配和清理回收。
.net 分为了两种类型的数据:值类型和引用类型,CLR也分别对两种类型做了内存上的处理
内存分配-值类型:
首先Windows使用虚拟寻址系统来管理内存,然后‘虚拟寻址系统把程序实际可用的内存地址再映射到硬件内存中的实际地址上,CLR的内存管理的分配,也就是在这个虚拟寻址系统上,也叫虚拟内存空间中。
在虚拟内存中有一块区域用来存储值类型数据,叫做栈区,,,(官方叫 栈 )
如代码:
int a=1;
if(a==1){
int b=2;
}
CLR 处理上面的值类型变量 a 和 b时,就是在内存的栈区分配了一个地址,先是通知负责记录内存地址的栈指针有了新的值类型字段,栈指针随之改变,减少4,因为值类型变量需要4个字节的空间。当然 b 在 a 之后的区域中,这个情况下当释放内存时 首先会先处理b 再处理 a ,与内存分配的情况刚好相反。如果a b 同时声明了,那么释放的顺序就后放到内存的数据先删除,及时后进先出。(注:栈指针总是指向下一个可用的空闲存储区域,当程序运行时,指针指向栈内存的内存块末尾。栈的填充是自上而下的,也就是从高位内存地址向低位内存地址填充。随着数据的增加,栈指针随之调整)。
内存分配-引用类型:
在虚拟内存中还有一块区域用来存储引用类型的数据,叫做托管堆
托管堆中保存的是一些需要长时间可用的数据,严格来说他的性能没有栈的高(栈 是程序自动分配内存,堆区是程序员new 出来的,告诉堆分配内存)
如下代码:
Student stu; stu= new Student(); |
stu 就是一个引用类型的变量,当程序执行第一行代码后,CLR先在栈上分配一个4字节的空间给变量 stu,执行第二行代码后,CLR然后在堆上分配内存来保存Student 对象中的数据。同时把堆上分配的内存所在的地址赋值给变量stu,也就是说引用类型Strdent 的数据在堆上,数据的地址在栈上保存着。
内存清理-垃圾回收
当CLR发现堆上的数据不再被栈引用时,CLR的垃圾回收器就会自动清理他们,当然也可以手动清理,调用GC.Collect() 即可,一般只有在处理大数据的数据回收时才调用,马上释放内存,前面提到了程序中的内存总是自上而下的填充的,也就是说中间有了一部分内存不再使用了,及内存的使用是不连续的,这势必会造成程序资源和相应时间的浪费,还好垃圾回收器还做了一个工作-将那些还在使用的数据移动到堆的顶端,让他们再次是连续的,及更改对象的地址,从而腾出连续的内存空白空间,提供了性能。不过在处理大数据时原理稍有不同,大数据不是存放在普通堆上,而是单独在堆上有一块区域(大对象堆 >85,000个字节)用来存放大数据,这样做的好处是因为数据的移动比较消耗性能,垃圾回收器为提供性能,不对这类数据移动。
需要说明垃圾回收器不保证在回收一次的情况就能把所有不再引用的数据清除。
这就是.net 的托管资源的内存清理原理,除此以外,程序中还会存在非托管的资源,如 文件句柄、网络连接,OleDBDataReader,StreamWriter,,,,, ,一部分非托管资源提供了回收方法,如文件处理和数据库连接的Close()方法,但是还有一部分是没有显示的提供类似的方法,这个时候要想回收这部分内存,可以在类中实现System.IDisposable接口( 点击:正确实现 IDisposable 接口),或者使用using语句
完---
.NET依托CLR进行的内存的管理的更多相关文章
- 一文了解.Net的CLR、GC内存管理
一文了解.Net的CLR.GC内存管理 微软官方文档对内存管理和CLR的概述 什么是托管代码? 托管代码就是执行过程交由运行时管理的代码. 在这种情况下,相关的运行时称为公共语言运行时 (CLR),不 ...
- CLR via C# 内存管理读书记
1. CLR 垃圾回收采用基于代的机制, 在一次垃圾回收中存活下来的对象被提升到另一代 2. 在确认对象是否垃圾时,从一组根开始,根包括静态字段,方法参数,局部变量等 3. 使用CriticalFin ...
- 浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- (转)浅谈SQL Server 对于内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- sqlServer对内存的管理
简介 理解SQL Server对于内存的管理是对于SQL Server问题处理和性能调优的基本,本篇文章讲述SQL Server对于内存管理的内存原理. 二级存储(secondary storage) ...
- 【uTenux实验】内存池管理(固定内存池和可变内存池)
1.固定内存池管理实验 内存管理是操作系统的一个基础功能.uTenux的内存池管理函数提供了基于软件的内存池管理和内存块分配管理.uTenux的内存池有固定大小的内存池和大小可变的内存池之分,它们被看 ...
- jboss内存查看管理 .
jboss内存查看管理 标签: jbossjavagenerationjvmclassjar 2009-04-09 14:47 4248人阅读 评论(2) 收藏 举报 本文章已收录于: // ' ...
- os内存使用管理之linux篇
os内存使用管理之linux篇 看一下LINUX内存机制是怎么运作的,了解了基础知识,对于理解和操作是有很大帮助的. 抛砖引玉: Linux 优先使用物理内存,当物理内存还有空闲时,linux是不会施 ...
- os内存使用管理之unix-AIX篇
os内存使用管理之unix-AIX篇 未完待补充.....
随机推荐
- 跟着大神重写的KNN 文档归类小工具
·背景 在知道KNN之前,楼主有时候会粗糙地做一些分类模型的计算.在拜读了Orisun大神[http://www.cnblogs.com/zhangchaoyang/articles/2162393. ...
- VS2012 update1 和 VS2012 Lang Pack 离线安装方法
原文:VS2012 update1 和 VS2012 Lang Pack 离线安装方法 最近有需要用VS2012打开ReactOS这个大项目,生成sln后打开用来导航代码什么的,但其代码都是ascii ...
- android如何判断服务是否正在运行状态
如何检查后台服务(Android的Service类)是否正在运行?我希望我的Activity能够显示Service的状态,然后我可以打开或者关闭它. /** * 判断服务是否处于运行状态. * @pa ...
- IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权
原文:IS2009制作Oracle 静默安装包(一)感谢空白先生特许授权 上一篇: MyEclipse中消除frame引起的“the file XXX can not be found.Please ...
- MVC5+ 路由特性
MVC5+ 路由特性 概述 ASP.NET MVC 5支持一种新的路由协议,称为路由特性. MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 案例 1.使用Visua ...
- Node.js连接MySQL数据库及构造JSON的正确姿势
做一下整理,以前也很随意的引入包链接数据库,后来发现常常连接出问题,异常退出,后来使用在网上一个方法解决问题,网址由于书签丢失,抱歉不能引用了.再有就是简单的模块化下,使得目录合理点,再有就是说明一下 ...
- SQL点滴16—SQL分页语句总结
原文:SQL点滴16-SQL分页语句总结 今天对分页语句做一个简单的总结,他们大同小异的,只要理解其中一个其他的就很好理解了. 使用top选项 *from Orders orderid from Or ...
- 组件接口(API)设计指南[5]-最后的思考
*阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 最后的思考 我通过困难的学习以及多年的失误.写了这片篇关于创建组件和a ...
- CRT
G - 中国剩余定理 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit S ...
- 常用在网站上的30个jQuery插件
jQuery插件是网页设计师最喜欢的.从图像滑块,图像画廊和导航插件,它们是如此众多,如此多样,如此惊人的和互动可以制作美化网站.在本文的在30个插件中,我认为必须在网站建设时用到.当然你现在可能不善 ...