堆和栈的区别

2016-04-29 zzyhappyzzy 更多博文 » 博客 » GitHub »

堆栈

原文链接 http://zyoung.me/%E5%A0%86%E5%92%8C%E6%A0%88%E7%9A%84%E5%8C%BA%E5%88%AB/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


堆栈

栈用于静态内存分配,堆用于动态内存分配,它们都存储在内存RAM里。

  • 栈上面的变量一般编译时就分配好了(如函数临时变量等)。栈遵循LIFO(后进先出),非常方便管理。
  • 栈的内存分配一般由系统管理,开发者无需关心。
  • 读取栈上的变量速度很快。
  • 当一个方法function被调用时,它会被push进栈中,该方法中的参数和局部变量存储在栈中,当方法执行完后,该方法pop出来,相应的栈空间被释放。

  • 堆上的变量,一般在程序运行期分配。
  • 读取堆上数据速度较慢。
  • 堆上的元素能够在任何时候被读取,开发者也能够在任何时候申请堆内存空间并且释放申请的空间,所以管理堆上的变量比较复杂。
  • 通常我们说的内存管理实际上是指堆内存管理。
  • 堆的大小仅受限于虚拟内存的大小。

说明

多线程开发中,每一个线程都有自己独立的栈,但是它们共享堆。