JVM虚拟机------运行时数据区-----JVM虚拟栈----局部变量表
局部变量表
又称:局部变量数组、本地变量表
定义一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量:基本数据类型、对象引用、以及returnAddress类型
局部变量表建立在线程的栈上,私有数据,不存在数据安全问题
局部变量表所需的容量大小是在编译器确定下来的,并保存在方法的Code属性的maximum local variables数据项中。在方法运行期间不变。
举个栗子,使用jclasslib插件
安装插件:idea---setting----plugins----直接搜jclasslib---直接安装!不会真有人不会吧
编译:鼠标右键------选择recompile java。
打开jclasslib:在view里面,自己找。不会找不到吧。
测试代码如下:
public class PCTest {? public static void main(String[] args) { int i; i = 0; int j = 1; int sum = i + j; System.out.println(sum); }? public void test1(int i){ int j = 10; byte x = 12; double sum = j + x + i; }}
首页
method
test1经过编译之后的指令集
局部变量表
规律
参数越多,局部变量表就越大,栈就需要更多的空间。
局部变量表中的变量只在当前方法调用中有效,废话!方法调用结束后,随着方法栈帧的销毁,局部变量表也会随之销毁
局部变量表的存储结构
其实是一个数组,slot就是一个存储空间
slot:变量槽------》最基本的存储单元Slot(变量槽)
局部变量表中存放编译器可知的各种基本数据类型8种、引用类型、return Address类型的变量
除了long、double占据两个slot以外,其它的占用一个slot槽
关于Slot的理解
JVM会为局部变量表中的每一个Slot都分配一个访问索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值
如果想访问long、double类型局部变量,那就是直接访问开始的slot地址。
实例方法、构造方法、中this存放在index为0的位置
对于静态方法:this不在该方法的局部变量表中,自然就不可以调用咯!
栈帧当中的局部变量表的槽位时可以重用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的局部变量就很可能会复用过期局部变量的槽位。从而达到节省资源的目的。
变量的分类
按照数据类型分:基本数据类型,引用数据类型
按照在类中声名的位置分:成员变量,在使用前,都经历过默认初始化赋值
类变量:linking的prepare阶段:给类变量默认赋值 ---》initial阶段----》进行类变量的显式赋值和静态代码块中的语句合并
实例变量:随着对象创建,会在堆空间中分配实例变量空间,并进行默认赋值
局部变量:在使用前,必须要进行显式赋值!否则编译不通过。
补充说明
在栈帧中,与性能调优关系最密切的部分就是前面提到的局部变量表,在方法执行时,虚拟机使用局部变量表来完成方法的传递
局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或者简介引用的对象就不会被回收。