内存分为三种:线程的堆栈、GC堆、LOH(large object heap)堆
- 线程的堆栈:
- 用于分配值类型实例;
- 有操作系统管理,不受垃圾收集器的控制。当值类型实例所在方法结束时,其存储单位自动释放;
- 栈的执行效率高,但是存储容量有限;
- GC堆:
- 用于分配小对象实例。如果对象的实例大小小于85000字节,将分配在GC堆上;
- 当有内存分配或者回收时,垃圾收集器可能会对GC堆进行压缩;
- LOH堆:
- 用于分配大对象实例。如果对象的实例大小>=85000字节,将分配在LOH堆上;
- LOH堆不会被压缩,只在完成GC回收时被回收;
堆栈的内存分配机制
对于值类型来说,一般创建在线程的堆栈上,但并非所有的值类型都创建在线程的堆栈上,例如作为类的字段时,值类型作为实例成员的一部分也被创建在托管堆上;装箱操作时,值类型字段也会拷贝在托管堆上。
堆栈的内存分配是由高位到低位向下填充,内存的释放从低位到高位进行释放。
public static void Main()
{
int i = 0;
char= 'a';
}
例如可用地址为1~100,执行 int i=0时,分配97 ~ 100共4个字节,执行 char= 'a’时,分配95 ~ 96共2个字节,执行到}位置时,方法结束,首先释放95 ~ 96 2个字节,然后释放97 ~ 100