程序设计中的堆和栈

来源:互联网 发布:青岛java招聘 编辑:程序博客网 时间:2024/05/20 09:23

参考函数调用的基本原理,就可以大概知道两者的不同,下面总结以下。

栈(stack)是为执行线程留出的内存空间(每一个线程都有一个栈)
当线程创建的时候,操作系统(OS)为每一个系统级(system-level)的线程分配栈。栈附属于线程,因此当线程结束时栈被回收。当线程被创建的时候,设置栈的大小。

特点:

  1. 跟踪栈简单
  2. 从栈中释放块(free block)只不过是指针的偏移而已
  3. 在栈上的每个字节频繁的被复用也就意味着它可能映射到处理器缓存中
  4. 大小有限

堆(heap)是为动态分配预留的内存空间(每一个应用程序通常只有一个堆尽管为不同类型分配内存使用多个堆的情况也是有的))
通常情况下,操作系统通过调用语言的运行时(runtime)去为应用程序分配堆。堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候扩展(分配器向操作系统申请更多的内存)。

特点:

  1. 跟踪堆困难
    和栈不一样,从堆上分配和重新分配块没有固定模式。因此,你可以在任何时候分配和释放它。这样使得跟踪哪部分堆已经被分配和被释放变的异常复杂;有许多定制的堆分配策略用来为不同的使用模式下调整堆的性能
    这里写图片描述
  2. 在堆上的变量必须要手动释放,不存在作用域的问题
  3. 大量的分配和释放可造成内存碎片
  4. 可以分配较大的内存