堆和栈一直不懂 做个笔记 源自 C# 入门到精通
操作系统和 "运行时" 通常将容纳数据的内存划分为两个独立区域,每个区域以不同的方式管理,这两个区域通常称为堆和栈。两者的设计目标完全不同。
- 调用方法时,它的参数和局部变量所需的内存总是从栈中获取。方法结束后,不管正常返回还是抛出异常,为参数和局部变量分配的内存都自动归还给栈。并可以在另一个方法调用时重新使用,栈上的方法参数和局部变量具有良好的生存期。方法开始时进入生存期,结束时结束生存期。
- 使用 new 关键字创建对象类的实例时,构造对象所需的内存总是从堆中获取。前面讲过,使用引用变量可从多个地方引用同一个变量。对象最后一个引用消失之后,对象占用的内存就可供重用,虽然不一定立即回收。堆上创建的对象具有较不确定的生存期,使用 new 关键字将创建对象。但只有在删除了最后一个对象引用之后的某个不确定时刻,它才会真正消失。
- 所有值类型都在栈上创建,所有引用类型的实例对象都在堆上创建。虽然引用本身还在栈上。可空类型实际是引用类型,所以在堆上创建。
不同的内存管理方式简述
- 栈内存就像一系列堆得越来越高的箱子调用方法时,他的每一个参数都被放入一个箱子并放到栈顶。每一个局部变量也同样分配到一个箱子,并同样放到栈顶。方法结束后,他的所有箱子都从栈中移除。
- 堆内存则像散布在房子里的一大堆箱子,不像栈一样,每个箱子都严格堆在另一个箱子上,堆的每个箱子都有一个标签标记了这个箱子是否正在使用。创建新对象时运行时查找空箱子,把它分配给对象,对对象以的引用则存储在栈上的一个局部变量中。运行时,跟踪每个箱子的变量引用数量。记住 2 个引用,可能用同一个对象,一旦最后一个引用消失运行时,就将箱子标记为未使用,将来某个时刻会清除箱子里的东西,使之重新使用。
正文完