计算机的内存可以分为代码块内存,stack内存和heap内存。代码块内存是在加载程序时存放程序机器代码的地方。
  • Stack(栈)一般存放函数内的局部变量
  • Heap(堆)存放全局变量和类对象实例等

若只是声明一个对象,则先在栈内存中为其分配地址空间,若再实例化它,则在堆内存中为其分配空间。

1、 栈(stack)与堆(heap)都是.net用来在Ram中存放数据的地方。与C++不同,.net自动管理栈和堆,程序员不能直接地设置栈或堆。

2、 栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。是一种先进后出的数据结构。存取速度比堆要快,仅次于直接位于CPU中的寄存器。但存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈内存是非托管的,不用.net垃圾回收器回收。另外,栈数据在多个线程或者多个栈之间是不可以共享的,但是在栈内部多个值相等的变量是可以指向一个地址的。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,.net的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

3、堆可以被看成是一棵树。堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

4、看一下值型类型和引用类型数据在内存堆和栈中的存储,例如声明一个值类型变量 int a=5,和一个引用类型变量 String str="cjavapy.com",内存中存储示意图如下,

1)int a=5;


2)String str="cjavapy.com",