几个月前本身提问的一个问题没人回答,如今忽然翻到,本身回答下:java
问题:程序员
好比
class{
private int i;
}
如上代码,以前一直觉得基本数据类型都是放在虚拟机栈中的,最近看了《深刻理解jvm》,里面说到方法内定义的基本数据类型放在帧栈里,并且栈里面的数据是线程独有的,不共享。 那么基本数据类型的全局变量,究竟是放在栈里面 仍是堆里面,或者方法区里?算法
解答:数组
java虚拟机栈是线程私有的,生命周期跟线程相同,每一个方法调用的时候都会建立一个栈帧用于存储局部变量表,操做数栈,动态连接,方法出口等信息。每一个方法调用的过程,就表明了一个栈帧在虚拟机栈中入栈到出栈的过程,当进入一个方法时,这个方法在栈中须要分配多大的内存都是彻底肯定的,方法运行时不会改变局部变量表的大小——《深刻理解java虚拟机第二版》
不少java程序员一开始就被网上的一些教程所误导:基本数据类型放在栈中,数组和类的实例放在堆中。 这个说法不许确,事实上,如上面的全局变量i,他是存放在java堆中。由于它不是静态的变量,不会独立于类的实例而存在,而该类实例化以后,放在堆中,固然也包含了它的属性i。
若是在方法中定义了int i = 0;则在局部变量表建立了两个对象:引用i和0。 这两个对象都是线程私有(安全)的。 好比定义了int[] is = new int[10]. 定义了两个对象,一个是is引用,放在局部变量表中,一个是长度为10的数组,放在堆中,这个数组,只能经过is来访问,方法结束后出栈,is被销毁,根据java的根搜索算法,判断数组不可达,就将它销毁了。安全