堆和栈是内存管理的两种方式。 栈是先进后出的数据结构。就像弹夹一样,先压进去的子弹总在最后一个击发。 计算机里的栈也是,先分配的那个内存会在最后一个释放。 举个例子: public void method(){ int a = 1; float b = 0.1; } 当调用这个方法的时候,首先在栈里分配a的内存空间,然后分配b的内存空间。当这个方法结束时,这两个内存空间都会被释放。堆分配没有栈的顺序原则,在堆中只要有空闲的空间就可以分配。这个就带来了内存回收的问题。在java中,只要new出来的对象都是在堆中分配空间的。所以java提供了垃圾回收机制专门回收那些失效的对象。
楼主【wujiaweizhuzhibin】截止到2008-07-21 11:52:48的历史汇总数据(不包括此帖):
发帖的总数量:3 发帖的总分数:20 每贴平均分数:6
回帖的总数量:3 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:1 结贴的总分数:5
无满意结贴数:0 无满意结贴分:0
未结的帖子数:2 未结的总分数:15
结贴的百分比:33.33 % 结分的百分比:25.00 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主该结一些帖子了
http://topic.csdn.net/t/20040111/15/2654217.html
栈是先进后出的数据结构。就像弹夹一样,先压进去的子弹总在最后一个击发。
计算机里的栈也是,先分配的那个内存会在最后一个释放。
举个例子:
public void method(){
int a = 1;
float b = 0.1;
}
当调用这个方法的时候,首先在栈里分配a的内存空间,然后分配b的内存空间。当这个方法结束时,这两个内存空间都会被释放。堆分配没有栈的顺序原则,在堆中只要有空闲的空间就可以分配。这个就带来了内存回收的问题。在java中,只要new出来的对象都是在堆中分配空间的。所以java提供了垃圾回收机制专门回收那些失效的对象。
操作系统对程序员可见的内存管理,一般是堆管理和栈管理.
堆管理,优势在于快速的随机分配内存,但是会产生大量的内存碎片,不便于垃圾回收.
栈管理,关键在于你存放数据的先后顺序,栈是后进先出的.
两者应用在不同场景,好象没有什么可比性.栈区,一般存放局部的数据.比如,方法的内部变量.当a方法调用b方法时,操作系统会进行现场保护,也就是把调用b前的一些数据进行压栈操作,然后进入b方法,当b执行完毕,在进行出栈操作,进行现场恢复,然后接着向后进行.堆区,一般存放程序的动态数据.比如,你在程序中经常会new一些对象,这些对象的产生过程是,操作系统在堆区根据Class的描述分配一块内存出来,然后将对象保存到这块区域,并返回对象的引用.