C#理解堆和栈

  1. 简介:
    我们把内存分为堆空间和栈空间
    线程堆栈:简称栈 Stack 栈空间比较小,但是读取速度快
    托管堆: 简称堆 Heap 堆空间比较大,但是读取速度慢
  2. 栈:
    栈的特征:数据只能从栈的顶端插入和删除把数据放入栈顶称为入栈(push)从栈顶删除数据称为出栈(pop)
    C#理解堆和栈


堆是一块内存区域,与栈不同,堆里的内存能够以任意顺序存入和移除
3.
C#理解堆和栈
4. C#理解堆和栈
GC Garbage Collector垃圾回收器
CLR的GC就是内存管理机制,我们写程序不需要关心内存的使用,因为这些都是CLR帮我们做了。

垃圾回收机制

C#中栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小。

栈 vs 堆:区别?
栈通常保存着我们代码执行的步骤,而堆上存放的则多是对象,数据等。我们可以把栈想象成一个接着一个叠放在一起的盒子。当我们使用的时候,每次从最顶部取走一个盒子。栈也是如此,当一个方法(或类型)被调用完成的时候,就从栈顶取走,接着下一个。堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,跟栈不同的是他们被调用完毕不会立即被清理掉。
栈与堆示意图

C#理解堆和栈

堆与栈
栈内存无需我们管理,也不受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),它所指向的另一块内存区才是我们真正的数据或者类型。

C#理解堆和栈

指针示意图
(图2)
指令:指向调用的方法的内部,如果该方法是第一次执行,首先要进行JIT即时编译。

作者:weixin_34269583
来源:CSDN
原文:https://blog.csdn.net/weixin_34269583/article/details/87033484
版权声明:本文为博主原创文章,转载请附上博文链接!