计算机世界里的“堆栈”你真的懂吗?( 二 )


 
二者区别
 
堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间 。即动态分配内存,对其访问和对一般内存的访问没有区别 。它由程序员分配和回收 。
 
栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来 。(后进先出)由系统自动分配和回收 。
 
堆栈缓存方式
 
栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放 。
 
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收) 。所以调用这些对象的速度要相对来得低一些 。栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器 。
 
栈:在windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域 。意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow 。因此,能从栈获得的空间较小 。
 
堆:堆是向高地址扩展的数据结构,是不连续的内存区域 。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址 。堆的大小受限于计算机系统中有效的虚拟内存 。由此可见,堆获得的空间比较灵活,也比较大 。
 
作为“堆”的数据空间,必须是灵活的,因为成千上万的程序员在写什么程序是未知的 。但可知道的一点,就是他们是跑在确定的某个OS里面的 。因此,也不过就是给系统管理的数据空间起了个名字,叫栈;给程序员使用的空间,起了个名,叫堆 。




推荐阅读