int a = 1存放的位置

参考资料1
参考资料2

方法内定义的基本数据类型放在帧栈里,而且栈里面的数据是线程独有的,不共享  — 《深入理解 JVM》
所以,局部成员变量 int a =1; 1存放在栈内存,那么 成员变量 int a=1; 存放在哪儿?

Java虚拟机栈是线程私有的,生命周期跟线程相同,每个方法调用的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法调用的过程,就代表了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中需要分配多大的内存都是完全确定的,方法运行时不会改变局部变量表的大小——《深入理解java虚拟机第二版》

全局变量i,他是存放在java堆中。因为它不是静态的变量,不会独立于类的实例而存在,而该类实例化之后,放在堆中,当然也包含了它的属性i。


如果在方法中定义了int i = 0;则在局部变量表创建了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 比如定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能通过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。


成员变量 int a = 1; a 存放在方法区,1存放在堆内存,a指向该内存
局部变量 int a = 1;a 存放在方法区, 1存放在栈内存,a指向该变量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章