java中的堆内存和栈内存
栈(stack):
???? 是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量.在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域).
???? 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的。所以栈内存中存放的都是方法运行中声明的基本数据类型,如short,int,long等,他们的长度都是一定的,并且生存期都是随着方法的结束而结束。
堆(heap):
????? 堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢,C中的malloc语句所产生的内存空间就在堆中.在java中,所有使用new xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用.堆内存中数据的生存期是由java的回收机制确定的,当栈中没有引用指向堆中的内存的时候,内存就会被回收。
1 楼 lvjun106 2012-03-20 当栈中没有引用指向堆中的内存的时候,内存就会被回收。应该是当栈中没有强引用指向堆中的内存的时候,内存就会被回收。 2 楼 linmomo02 2012-03-20 lvjun106 写道当栈中没有引用指向堆中的内存的时候,内存就会被回收。
应该是当栈中没有强引用指向堆中的内存的时候,内存就会被回收。
小弟菜鸟,弱弱的问一下老大,何谓强引用 3 楼 lvjun106 2012-03-20 http://lvjun106.iteye.com/blog/1451866
参考看一看吧。 4 楼 mfkvfn 2012-03-21 “先进后出”听说很别扭,一般不是称“后进先出”吗? 5 楼 linmomo02 2012-03-21 mfkvfn 写道“先进后出”听说很别扭,一般不是称“后进先出”吗?
嗯。也是,虽然是一个意思但后面的那个说法好像更专业一些。