看了http://www.cnblogs.com/liulun/p/3145351.html  不错,补习下相关技术。。

正文: .NET依托CLR进行的内存的管理

  有了CLR 基本不需要担心.net程序的内存管理,他负责了内存的分配和清理回收。

.net 分为了两种类型的数据:值类型和引用类型,CLR也分别对两种类型做了内存上的处理

内存分配-值类型:

  首先Windows使用虚拟寻址系统来管理内存,然后‘虚拟寻址系统把程序实际可用的内存地址再映射到硬件内存中的实际地址上,CLR的内存管理的分配,也就是在这个虚拟寻址系统上,也叫虚拟内存空间中。

  在虚拟内存中有一块区域用来存储值类型数据,叫做栈区,,,(官方叫 栈 )

  如代码:

int a=;
if(a==){
int b=;
}

  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的工作的更多相关文章

  1. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

  2. 找工作——JVM内存管理

    1. JVM类加载机制 类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括:加载.连接(验证.准备.解析).初始化.使用和卸载阶段. 加载:根据查找路径找到对应的class文件,然后倒 ...

  3. 深入理解JVM虚拟机-2自动内存管理机制

    java虚拟机所管理的内存将会包括一下几个运行时数据区域. 程序计数器: 程序计数器是一块较小的内存空间.字节码解析式工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支.循环.跳转 ...

  4. 《Effective C++》内存管理

    如果global new-hander没有成功配置,会抛出一个std::bad_alloc的exception. #include<iostream> #include<new> ...

  5. Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射.页面分配.页面回收.页面交换.冷热页面.紧急页面.页面碎片管理.页面缓存.页面统计等,而且对性能也有很高的要 ...

  6. Java自动内存管理机制学习(一):Java内存区域与内存溢出异常

    备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...

  7. Objective-C:Objective-C 和 Core Foundation 对象相互转换的内存管理

    Objective-C 和 Core Foundation 对象相互转换的内存管理 iOS允许Objective-C 和 Core Foundation 对象之间可以轻松的转换,拿 NSString ...

  8. Objective-C 和 Core Foundation 对象相互转换的内存管理总结

    本文转载至 http://blog.csdn.net/allison162004/article/details/38756649 OS允许Objective-C 和 Core Foundation ...

  9. PHP内核探索:内存管理开篇

    内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的.和CPU计算能力一样, 内存也是 ...

随机推荐

  1. 微软职位内部推荐-Sr SDE for Win Apps Ecosystem

    微软近期Open的职位: Job posting title: Senior Software Design Engineer Location: China, Beijing Level: 63 D ...

  2. creating indexing for SQL tunning

    1. Not so long time ago, I got a report from customer. It's reported that they had a report getted v ...

  3. Ubuntu修改屏幕默认亮度

    sudo gedit /etc/default/grub 把GRUB_CMDLINE_LINUX="" 改成GRUB_CMDLINE_LINUX="acpi_backli ...

  4. OpenWrt固件刷入后串口终端没有反应的问题

    [路由器开发板硬件固件配置] MTK双频:MT7620a + MT7612e 内存:256 MB 闪存:16 MB 固件:MTK自带SDK中的OpenWrt固件(mtksdk-openwrt-2.6. ...

  5. Asp.net弹出层并且有遮罩层

    长久以来,asp.net弹出层并且有遮罩层问题都是一个难以解决的问题,鉴于此,我决定写个弹出层发布出来,供大家使用... 这里的doing层是遮罩层,divLogin层是登陆层 若有其他问题请留言或邮 ...

  6. angular入门系列教程目录

    本系列教程的目标很明确,就是入门,会一步一步的从零到最终的能写出一个基本完整的应用.这个过程中不去纠结一些概念或者是如何实现等等深入的东西,只是停留在应用层. ps:如果条件允许的话,后续会有深入一点 ...

  7. XCode签名证书死活不能选

    Editors>Show Values on Xcode , then you can select the code sign instead of typing

  8. Tern Server Timeout

  9. DispatcherServlet--Spring的前置控制器作用简介

    参考网址:http://jinnianshilongnian.iteye.com/blog/1602617 Struts有一个ActionServlet,用来完成前置控制器(分发器)的功能.其实,所有 ...

  10. 并行编译加快 VS C++ 项目的编译速度

    最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...