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