- 简介:
我们把内存分为堆空间和栈空间
线程堆栈:简称栈 Stack 栈空间比较小,但是读取速度快
托管堆: 简称堆 Heap 堆空间比较大,但是读取速度慢
- 栈:
栈的特征:数据只能从栈的顶端插入和删除把数据放入栈顶称为入栈(push)从栈顶删除数据称为出栈(pop)
-
堆
堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除
堆
GC Garbage Collector垃圾回收器
CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。
C#中栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。
栈 vs 堆:区别?
栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
栈与堆示意图
栈内存无需我们管理,也不受GC管理。当栈顶元素使用完毕,立马释放。而堆则需要GC(Garbage collection:垃圾收集器)清理。
什么元素被分配到栈?什么被分配到堆?
栈存储的是基本值类型,堆存储的是new出来的对象。引用类型在栈中存储一个引用,其实际的存储位置位于托管堆。
当我们程序执行的时候,在栈和堆中分配有四种主要的类型:值类型,引用类型,指针,指令。
值类型:
在C#中,继承自System.ValueType的类型被称为值类型,主要有以下几种(CLR2.0中支持类型有增加):
- bool
- byte
- char
- decimal
- double
- enum
- float
- int
- long
- sbyte
- short
- struct
- uint
- ulong
- ushort
引用类型:
以下是引用类型,继承自System.Object:
- class
- interface
- delegate
- object
-
string
指针:在内存区中,指向一个类型的引用,通常被称为“指针”,它是受CLR( Common Language Runtime:公共语言运行时)管理,我们不能显示使用。需要注意的是,一个类型的引用即指针跟引用类型是两个完全不同的概念。指针在内存中占一块内存区,它本身只代表一个内存地址(或者null),它所指向的另一块内存区才是我们真正的数据或者类型。
(图2)
指令:指向调用的方法的内部,如果该方法是第一次执行,首先要进行JIT即时编译。