黑马程序员: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)堆:由程序员安排。