使用.Net框架开发程序的时候,我们无需关心内存分配问题,
因为有GC这个大管家给我们料理一切。
C#程序在CLR上运行的时候,内存从逻辑上划分两大块:栈,堆。
这俩基本元素组成我们C#程序的运行环境。
栈 vs 堆:区别
栈通常保存着我们代码执行的步骤,
int x变量,int y变量等等。
而堆上存放的则多是对象,数据等。
可以把栈想象成一个接着一个叠放在一起的盒子。
当我们使用的时候,每次从最顶部取走一个盒子。
栈也如此,当一个方法被调用完成的时候,就从栈顶取走,接着下一个。
堆则不然,像是一个仓库,储存着我们使用的各种对象等信息,
跟栈不同的是他们被调用完毕不会立即被清理掉。
栈内存无需我们管理,也不受GC管理。
当栈顶元素使用完毕,立马释放。
而堆则需要GC(Garbage collection:垃圾收集器)清理。
当我们程序执行的时候,在栈和堆中分配有值类型和引用类型
值类型:
继承自System.ValueType的类型被称为值类型,
主要有以下几种:
* bool
* byte
* char
* decimal
* double
* enum
* float
* int
* long
* sbyte
* short
* struct
* uint
* ulong
* ushort
引用类型:
继承自System.Object:
* class
* interface
* delegate
* object
* string
当程序需要更多的堆空间时,GC需要进行垃圾清理工作,
暂停所有线程,找出无被引用的对象,进行清理。
并通知栈中的指针重新指向地址排序后的对象。
当我们使用引用类型的时候,
一般是对指针进行的操作而非引用类型对象本身。
但是值类型则操作其本身。 |