class{
private int i;
}
如上代码,基本数据类型并不都是存放在虚拟机栈中,在《深入理解JVM》中
- 方法内定义的基本数据类型放在栈桢中,栈里面的数据是线程私有的,不共享。
- 方法外定义的全局变量,存放在java的堆中
java虚拟机是线程私有的,生命周期跟线程是相同的,每个方法调用的时候都会创建一个栈桢用于存储局部变量表,操作数栈,动态链接,方法出口信息等。
每个方法的调用的过程,代表着一个栈桢在虚拟机栈中入栈到出栈的过程。当进入到一个方法的时候栈中需要分配多大的内存都是完全确定的。方法运行时不会改变局部变量表的大小。
事实上,如上面的变量i,它不是静态变量,不独立于类的实例存在,而该类实例化后放在堆中,当然也包含它的属性i。
class{
public void test(){
int j = 0 ;//1
int[] s = new int[10]; //2
}
}
1.上述第一行代码在局部变量表中创建了两个对象:引用 j 和 0。这两个对象都是线程私有的。
2.上述第二行代码定义了两个对象,一个是s引用,放在局部变量中,一个是长度为10 的数组方法堆中,这个数组只能通过s来访问。方法结束后出栈,s被销毁,随后根据java的根搜索法,判断数组不可达,就将他销毁。