A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘斌 中级黑马   /  2012-12-20 12:39  /  1154 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

使用.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需要进行垃圾清理工作,
暂停所有线程,找出无被引用的对象,进行清理。
并通知栈中的指针重新指向地址排序后的对象。


当我们使用引用类型的时候,
一般是对指针进行的操作而非引用类型对象本身。
但是值类型则操作其本身。

评分

参与人数 1技术分 +1 收起 理由
张文 + 1

查看全部评分

1 个回复

倒序浏览
整理的不错,顶一下
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马