黑马程序员技术交流社区

标题: 栈 vs 堆 [打印本页]

作者: 刘斌    时间: 2012-12-20 12:39
标题: 栈 vs 堆
使用.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需要进行垃圾清理工作,
暂停所有线程,找出无被引用的对象,进行清理。
并通知栈中的指针重新指向地址排序后的对象。


当我们使用引用类型的时候,
一般是对指针进行的操作而非引用类型对象本身。
但是值类型则操作其本身。
作者: 王晨    时间: 2012-12-20 19:03
整理的不错,顶一下




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2