.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篇 未完待补充.....
随机推荐
- .net mvc mssql easyui treegrid 及时 编辑 ,支持拖拽
这里提到了,1个问题,怎么扩展 Easyui 参见: http://blog.csdn.net/chenkai6529/article/details/17528833 @{ ViewBag.Titl ...
- AWK增强的文本处理shell特征--AWK完全手册
AWK这是一个很好的文字处理工具. 它不仅 Linux 中也是不论什么环境中现有的功能最强大的数据处理引擎之中的一个. 本文主要摘录池中龙写的Unixawk使用手冊(第二版),对当中内容略微修改.感谢 ...
- linux下mysql的远程连接
在服务器上安装mysql后,想使用本地的mysql客户端连接数据库时,提示不允许连接,比较郁闷,找到了这篇文章解决了我的问题: 内容如下: 本地计算机ip:192.168.1.100远程计算机ip:1 ...
- orleans开篇之hello world
orleans开篇之hello world 什么是orleans Orleans是一个建立在.NET之上的,设计的目标是为了方便程序员开发需要大规模扩展的云服务.Orleans项目基本上被认为是并行计 ...
- Asp.net 4.0,首次请求目录下的文件时响应很慢
原文:Asp.net 4.0,首次请求目录下的文件时响应很慢 1. 问题起因2. 尝试过的处理思路3. 解决方法 1. 问题起因 一个从VS2003(.Net Framework 1.1)升级到.ne ...
- Mybatis包分页查询java公共类
Mybatis包分页查询java公共类 分页----对于数据量非常大的查询中.是不可缺少的. mybatis底层的分页sql语句因为须要我们自己去手动写.而实现分页显示的时候我们须要依据分页查询条 ...
- node.js + mongodb
node.js + mongodb 这次内容是结合bootstrap把登陆注册做好,还有就是express的中间件等问题. 看这篇博客之前建议先看我上篇写的那篇博客http://www.cnblogs ...
- 快速构建Windows 8风格应用5-ListView数据控件
原文:快速构建Windows 8风格应用5-ListView数据控件 本篇博文主要介绍什么是ListView数据控件.如何构建ListView数据控件. 什么是ListView数据控件? 1) Li ...
- 摘录DirectShow数据,视频采集
DirectShow在,数据流(Data Flow)它们是依次流过每Filter的.管理其数据具有其自己的方法,并且并没有向用户提供一个统一的接口,供用户操作数据流.这里以提取视频採集在的每帧为位图数 ...
- 曲演杂坛--一条DELETE引发的思考
原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID ,) PRIMARY KEY, D ...