栈有点像酸菜坛子,腌酸菜的时候只能一层一层从下往上放白菜,吃的时候只能从上往下一层一层拿了吃,顺序是相反的,先进去的总是放在最后面,系统通过这种方式管理和使用重要变量的值。栈的资源总是很有限,至多不过几MB,因为不需要那么多,在内存中栈区和非栈区看起来没有什么区别,是系统设定的栈的高度。当我们把栈内堆积了太多东西,数据就有可能越过栈的最大高度,表现为数据覆盖了其他有用的代码区,程序崩溃,这就叫栈溢出。
堆可以比喻成一个零散货物的大仓库,一大堆东西怎么放都行,程序员需要自己构造链表和树结构来管理这些内存(如果需要管理的话),堆空间非常非常大,大到一般情况下你几乎不可能把它用完,编译器一般吧和前后顺序没有关系的变量和对象放在堆中,你声明一个对象,它的生存期是独立于其他变量的,它一般被放在堆中(就好像扔进去了),这依赖于编译器的具体设定,唯一能确定堆里东西的方法就是记录它的地址,如果地址丢了,这个堆中的对象就永远找不到了。 |