整理和总结如下:
先从C语言里的看(内存四个区之二):
1)栈区:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放
2)堆区(动态存储区):用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
然后返回再到我们C#这样更好理解:
1).在.NET Framework中,内存中的资源分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CLR(通用语言运行时)的管理(诸如内存类型安全性检查),而非托管资源则不必接受.NET Framework的CLR管理.
托管资源在.NET Framework中又分别存放在两种地方: "堆栈"和"托管堆"(堆栈是栈不是两者!);
2).在C#中,虚拟内存中有两个存储变量的区域,一个堆栈和一个托管堆(如下图-表格形式):
进程 4G虚拟内存(存储.exe/.dll/程序运行的所有变量)
堆栈(值类型):
托管堆(引用类型): CLR初始化进程时,为进程保留的一个进程地址空间区域,用于存储和管理对象,受
圾收集器的控制和管理!
|