C# 内存分配,CLR内存分配,.NET框架

转载自以下几篇文章:
https://www.cnblogs.com/Joy-et/p/4200128.html CLR内存分配
https://blog.csdn.net/zhaom888/article/details/79126347 C#内存分配
https://blog.csdn.net/u010032648/article/details/50298663 C# 垃圾回收中的大对象
https://www.cnblogs.com/cocoon/p/4997005.html C#、.NET Framework、CLR的关系
https://blog.csdn.net/Muf/article/details/656920 您也使用托管C++吗?
https://blog.csdn.net/sk623/article/details/50015413 C#中的内存四区

.NET框架是一个独立发布的软件包,其包含了CLR、类库以及相关的语言编辑器等工具。C#代码经过编译之后在CLR环境中运行。

C#所开发的程序源代码并不是编译成能够直接在操作系统上执行的二进制本地代码。它是被编译成为中间代码,然后通过.NET框架的虚拟机(即CLR)来执行。所以如果计算机上没有安装.Net框架,那么程序将不能够被执行。在执行的过程中,.Net框架会将中间代码翻译成为二进制机器码,从而使它得到正确的运行。最终翻译的二进制代码将被存储在一个缓冲区中。所以一旦程序使用了相同的代码,那么将会调用缓冲区中的版本。这样如果一个.Net程序第二次被运行,那么这种翻译不需要进行第二次,速度会明显加快。

那C++呢? 
https://blog.csdn.net/Muf/article/details/656920 您也使用托管C++吗?
C++内存包括:栈,堆,全局/静态存储区,常量区,程序代码区。
C#内存包括:栈,堆,全局/静态存储区,常量区,自由存储区。
CLR:栈、GC堆、大对象堆。

https://blog.csdn.net/sk623/article/details/50015413 C#中的内存四区
C#只是在内存管理方面对程序员隐藏了,并不代表它不涉及这些东西,甚至其内部内存管理或许比自己手动管理更加复杂。笔者从内存四区(栈区、堆区、全局区、代码区)的角度对C#语言中常见的几种情况分析其内存,但是只是从现象上根据C/C++类似的状况进行推断理解,其底层无法得知,而且针对内存分区也有不同的观点,所以纯属个人体会,欢迎指正。

个人观点,没有查证:
C++在印象中是需要手动管理内存的,但是.net支持的语言里存在C++,C#,F#等,这些语言都各自有自己的内存分配规则,这些规则相互之间都应该是存在差异的,但是经过编译变成中间语言之后,再由CLR处理,所有的内存管理就都变成了CLR规则下的管理。也就是说,C#假如在另外一种框架下,或者是开放C#自带的内存管理机制,也许就可以变成需要手动管理内存的语言了。


1,C#之内存分配
在C#中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

全局/静态存储区,全局变量和静态变量被分配到同一块内存中。

常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多)

2,CLR内存分配
公共语言运行时,类似Java的jvm,是直接建立在OS上的虚拟环境,主要任务是管理代码运行。CLR现在支持几十种现代的编程语言为它编写代码,然后以一种中间语言(IL)代码的形成被执行。

CLR内存分配分三大块区域:栈、GC堆、大对象堆。
当CLR载入内存之后,会初始化两个托管堆,一个大对象堆(LOH –large object heap)和一个小对象对(SOH – small object heap)。
对于SOH,对象在执行一次垃圾回收之后,会进入到下一代。也就是说如果在第一次执行垃圾回收时,存活下来的对象会进入第1代,如果在第2次垃圾回收之后该对象仍然没有被当作垃圾回收掉,它就会成为2代对象;2代对象就是最老的对象不会在提升代数。
从代的角度看,大对象属于2代对象,因为只有在2代回收时才会处理大对象。

一、线程堆栈(栈)
用于分配值类型实例。栈由操作系统进行管理,不受GC管理,当值类型不在其作用域(主要是指其所在函数内)时,其所占栈空间自动释放。栈的执行效率是非常高的。

二、GC堆(堆)
用于分配小对象实例。所谓小对象就是大小小于85000字节(约为83k)的实例对象。GC堆分三代垃圾进行管理,当进行GC操作(垃圾回收)时,垃圾收集器会对GC堆进行压缩回收。

三、大对象堆(LOH)
用于分配大对象实例。大对象就是大小大于85000字节(约为83k)的实例对象。大对象分配在LOH上,不受GC控制,不会被压缩,只有在完全GC回收(只有在2代回收时才会处理大对象)时才会被回收。

注意:
a.栈的分配是向低地址扩展,而堆的分配是向高地址扩展。
b.值参数与引用参数的本质,值参数是对栈中数据的拷贝,引用参数则是对栈地址的引用。当值参数为某引用对象时,可以改变该引用对象某些值,但不能将值改变成新对象的地址。
c.堆中的对象都有同步块索引(占4个字节)、类型句柄(占4个字节)

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这本书是什么? * 这本电子书严格来说是我复习C#基础知识来的,我从09年初开始使用asp.net进行b/s开发,之前一直使用asp。在实际开发中深感C#的强大,也深深感到自身基础知识的欠缺,因此重新从头开始学习C#,在学习的过程中最主要是借助Illustrator C# 2008(译名:插图详解C#2008或C#图解教程)这本书,(准确讲,这本电子书可以说是我对Illustrator C# 2008的读书笔记)同时查阅了msdn及许多相关的资料 ,前后近两个月;但本系列尚未完成,目前还有多线程及涉及C# 3.0中的新知识没有完成。 * 这本书有什么? * 本电子书一共21节,主要包含本人实际项目中自我感到难点的东西,如委托、事件、泛型等,进行了个人的一些总结的归纳,最后附一个我做的WinForm程序。 * 这本书适合哪些人? * 这本书内容其实很少,你可以很快就可看完;内容也只是十分简陋,主要是我本人在实现应用的体会的难点问题的总结。再加上我本人技术水平十分有限,因此我要提前声明:由于内容简略,不适合新手,以免误人子弟;内容浅显,更不适合老鸟。我本人也是抱着交流学习的目的将它发布的,欢迎大家针对本书内容的问题进行交流探讨。 * 最后,极力向大家推荐Illustrator C# 2008,不要被它的名字迷惑,认为它只是一本入门级的读物;作者是技术专家,对C#有极其深刻的见解;语言十分流畅,书中的插图十分形象易懂,从头到尾内容循序渐进,层层递进,尤其对内存分配有着详尽的描述。无论是新手还是老手,绝对值得一读。中文版翻译也还可以,如果英文好的话建议直接阅读英文版。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值