黑马程序员:Java培训、Android培训、iOS培训、.Net培训

                  栈与堆的区别

一、程序所占用内存的分类

    1、栈区(stack):由编译器自动分配和释放。存放函数的参数值、局部变量值等。 操作方式类似数据结构的中的栈。

    2、堆区(heap):由程序员分配和释放(程序员不释放,程序结束时由os释放)。其与数据结构中的堆使两回事。操作方式类似链表。

    3、全局区(静态区)(static):全局变量与静态变量存放在一块。程序结束后由系统释放。

    4、文字常量区:存放常量字符串。程序结束后由系统释放。

    5、程序代码区:存放函数体的二进制代码。

二、栈与堆的区别

   1、数据结构上的栈与堆

  1)栈:一种“后进先出”性质的数据结构。

  2)堆:一种经过排序的树形数据结构。

  3)程序的栈与堆和数据结构上的栈与堆有所区别。

    1、申请与回收方式

      1)栈:由系统自动分配和回收。例如:int b;

      2)堆:程序员自己申请,手动回收(C的free(),C++的delete),JAVA虚拟机自动回收。例如:p = new Font(); 

             //p在栈区,new Font()在堆区(C中的molloc()函索有此功能)

    2、大小限制和响应

      1)栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存空间,最大空间为2M。申请后,只有栈的剩余空间大于所申请空间,系统为程序提供内存。

               如果申请的空间超过栈的剩余空间,将会提示overflow。

      2)堆:堆是向高地址扩展的数据结构,是一块不连续的内存空间,其空间大小受限于计算机系统中有效的虚拟内存。因此,堆获得的空间比较灵活,且较大。申请后,

              程序首先遍历一个链表(该链表记录空闲内存地址),直到找到第一个空间大于所申请空间的堆。

   3、申请速度

      1)栈:速度块,但程序员无法控制。

      2)堆:速度较慢,且容易产生内存碎片,不过用起来方便。

   4、存储内容

      1)栈:首先是函数调用后的下一条指令(函索调用语句的下一条可执行语句)的地址,然后是函索的各个参数(由右往左入栈),最后是函数的局部变量。

      2)堆:由程序员安排。