.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篇 未完待补充.....
随机推荐
- Socket 学习(一)
本次项目增加的引用using System.Net; using System.Net.Sockets; using System.Threading; TextBox.CheckForIllegal ...
- python算法题
python几道简单的算法题 最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都 ...
- C#抓取AJAX页面的内容
原文 C#抓取AJAX页面的内容 现在的网页有相当一部分是采用了AJAX技术,所谓的AJAX技术简单一点讲就是事件驱动吧(当然这种说法可能很不全面),在你提交了URL后,服务器发给你的并不是所有是页面 ...
- String 的intern() 方法说明
1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...
- Your build host version of Xamarin.IOS (release NO.)is too recent to work with the IOS designer
Encounted such error in VS after I update the xamarin at Mac side.Here is the solution for u to refe ...
- 1001. 杀死吸引力(3n+1)猜想 (15)(ZJUPAT 数学)
主题链接:http://pat.zju.edu.cn/contests/pat-b-practise/1001 卡拉兹(Callatz)猜想: 对不论什么一个自然数n,假设它是偶数,那么把它砍掉一半. ...
- 通过SqlClr制作Sql自动化批量执行脚本
原文:通过SqlClr制作Sql自动化批量执行脚本 通过SqlClr制作Sql自动化批量执行脚本 在与同事一起做项目时,看到同事用sqlclr做批量执行脚本,感觉挺新奇的就上网搜集资料自己模仿跟做了个 ...
- Android在View拉丝工艺和invalidate()和其他相关方法
转载请注明出处:http://blog.csdn.net/qinjuning 前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 . ...
- OAuth简介及sina微博开放平台
OAuth简介及sina微博开放平台 2010-10-26 13:15:25 标签:新浪 sina 微博 OAuth 开放平台 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者 ...
- 基于.NET的微信SDK
超级懒汉编写的基于.NET的微信SDK 一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的 ...