日期:2014-05-20  浏览次数:20728 次

关于java的堆与栈
好像一般的说法是基本变量及引用变量是在栈中存放的,对象等在堆中保存
那么,加入我声明一个List,这个List的地址应该是在栈中保存的,那List中的对象的地址在栈中还是堆中保存?
1   如果在栈中,那么jvm怎么知道这个List的大小从而在栈中分配空间?
2   如果在堆中,那么就是一些引用类型存放在堆中了

List <Object>   list     地址为0x000001
栈                                     堆
0x00001                     Object   o  


还是
栈                                                                     堆
List <Object>   list

0x00001

Object   o


------解决方案--------------------
1你创建个list的引用不初始化不能加入其他对象,你的引用是对其他的list的引用的话所引的对象也是在堆中创建的
2list中存的是对象的地址,至于它是堆中还是栈中取决于对象本身而不是list
3仅代表个人观点,请高手指正

------解决方案--------------------
好像一般的说法是基本变量及引用变量是在栈中存放的,对象等在堆中保存

----不知这句对不对

------解决方案--------------------
up
------解决方案--------------------
这篇文章不错
http://www.blogcn.com/u/47/61/guiguzi629/blog/44733219.html
------解决方案--------------------
这个问题建议LZ看下Inside the Java Virtual Machine(by Bill Venners)
在Java Virtual Machine内存分为method area,heap,java stacks,native method stacks,这个跟经典的unix内存分配方式是有些区别的,自己对Java Virtual Machine理解也不是很透彻,以lz的问题来说,如果这个list你是定义成static的属性,那么是在method area中,如果是非static的属性的话,是在heap中,如果是local变量,那么在他所属的thread的java stack中,如果调用C++的话,有可能在native method stack中,拙见!!!!
------解决方案--------------------
to yuekun1172006(编编编):
int是基本类型,所以n是存放在栈中的。lz看看下面的例子就明白了:
public class A{
int n = 0;
}
在引用这个类的地方:
public class Test{
public static void main(String[] args){
A a = new A();
A b = new A();
System.out.println(a.n == b.n);
}
}
结果是true;原因是n是int类型,属于基本类型,a.n和b.n所指向的都是相同的值 0,是放在栈中的。

------解决方案--------------------
mark 等下回来看
------解决方案--------------------
去看看孙鑫老师的视频,讲的不错的