内存区域一般最起码都有两种:一种是栈内存;一种是堆内存
栈内存:
1)存放的内容:基本类型的变量(Java中还有对象引用)、函数调用(参数值、局部变量、返回地址等)等等;
2)申请方式:由系统自动分配释放的内存空间;
3)申请后系统响应:只要系统中栈的剩余空间大于所申请的空间,系统将为程序提供内存,否则提示栈溢出;
4)空间大小:Windows中栈是由高地址向低地址扩展的数据结构,是一块连续的内存区域。所以说栈的容量是固定的(不同的系统有自己的常数),因此栈的空间较小;
5)分配效率:系统自动分配,速度较快;
6)分配方式:其操作方式类似于数据结构中的栈。栈有两种分配方式:静态分配和动态分配。静态分配由编译器完成(如局部变量的分配),动态分配同malloc函数时行(但栈的动态分配由编译器完成不需要我们手工实现)
堆内存:
1)存放的内容:程序中new的对象和数组等等;
2)申请方式:一般由程序员手动申请分配与释放,若程序员不释放则可能造成内存泄露和溢出;
3)申请后系统响应:操作系统一般维护有一张记录空闲内存地址的链表,当系统收到程序申请时会遍历空闲链表,找到第一块空间大于所申请空间的堆结点,然后从链表中删除(如果申请空间小于当分配空间会将多余的部分重新挂到空闲链表中)该结点,将该结点分配给程序
4)空间大小:堆是由低地址向高地址扩展的数据结构,是不连续的内存区域。所以系统是用链表来存储空闲区域的,其大小受限于计算机有效的虚拟内存,因此空间比较灵活、较大
5)分配效率:一般速度较慢,且容易产生内存碎片;
6)分配方式:其分配方式类似于链表。堆都是动态分配的,没有静态分配的堆;
最后参考文献写一句比较经典的比喻来说明栈和堆的区别:
使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小;
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大;