.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篇 未完待补充.....
随机推荐
- 动态类(Dynamic)应用
动态类(Dynamic)应用 背景: 在Coding中有时候会遇到一些需要解析的数据,可是数据的字段数量和名称未统一,我们没法定义实体类来对应.那么我们就会想到通过C#的dynamic动态类来实现,如 ...
- Unix/Linux环境C编程新手教程(41) C语言库函数的文件操作具体解释
上一篇博客我们解说了怎样使用Linux提供的文件操作函数,本文主要解说使用C语言提供的文件操作的库函数. 1.函数介绍 fopen(打开文件) 相关函数 open,fclose 表头文件 #in ...
- The Swift Programming Language-官方教程精译Swift(5)集合类型 -- Collection Types
Swift语言提供经典的数组和字典两种集合类型来存储集合数据.数组用来按顺序存储相同类型的数据.字典虽然无序存储相同类型数据值但是需要由独有的标识符引用和寻址(就是键值对). Swift语言里的数 ...
- 基于Http替补新闻WebService数据交换
该系统的工作之间的相互作用.随着信息化建设的发展,而业界SOA了解并带来低TOC(总拥有成本)其他优势.越来越多的高层次的信息使用者关注. 这里暂且不提SOA这种架构规划.在系统间集成协议简单的讨论. ...
- POJ 3311 Hie with the Pie floyd+状压DP
链接:http://poj.org/problem?id=3311 题意:有N个地点和一个出发点(N<=10),给出全部地点两两之间的距离,问从出发点出发,走遍全部地点再回到出发点的最短距离是多 ...
- 推荐两个针对github的chrome插件
作为一只程序猿,在github上找代码.看代码是再正常不过的事情了.这时候有个工具可以方便你翻看代码,想必是极好的. Sourcegraph for GitHub 这个插件允许你像使用IDE那样浏览代 ...
- 解决wps for linux 中文输入法光标不跟随的问题
需要安装qt4-qtconfig和ibus-qt4,安装ibus-qt4之后才能在qt4-qtconfig“界面”选项卡默认输入法选项中看到ibus,选定它,然后设置XIM输入风格为光标跟随风格,保存 ...
- PHP专业开发IDE——Zend Studio 10.5预览版发布
Zend Studio是新一代的PHP IDE,高效的开发和维护PHP代码是它的核心.Zend公司目前已发布了Zend Studio 10.5预览版,预览版中提高了快速响应能力和时时误差检查.因此使用 ...
- SQL Server 远程链接服务器详细配置
原文:SQL Server 远程链接服务器详细配置[转载] http://hi.baidu.com/luxi0194/blog/item/a5c2a9128a705cc6c2fd7803.html - ...
- extern用法汇总
extern 在源文件A里定义的函数,在其他源文件中是看不见的(即不能訪问).为了在源文件B里能调用这个函数,应该在B的头部加上一个外部声明: extern 函数原型: 这样,在源文件B里也能够调 ...