局部变量表也被称之为局部变量数组或本地变量表
package test;
public class HelloLoader {
public static void main(String[] args) {
int i=1;
test();
}
public static void test(){
int a;
int b;
Thread thread = new Thread();
}
}
mian方法中: 操作数栈最大深度: 1 局部变量最大槽数: 2 字节码长度:6
(main)字节码文件 : 0 iconst_1 1 istore_1 2 invokestatic #2 <test/HelloLoader.test : ()V> 5 return
具体解读
栈帧中的局部变量表中的槽位是可以重用的,如果一个局部变量过了其作用域,那么在其作用域之后申明的新的局部变就很有可能会复用过期局部变量的槽位,从而达到节省资源的目的。(因为局部变量表是一个数组,数组的大小不能动态的进行调整)
public class SlotTest {
public void localVarl() {
int a = 0;
System.out.println(a);
int b = 0;
}
public void localVar2() {
{
int a = 0;
System.out.println(a);
}
//此时的就会复用a的槽位
int b = 0;
}
}
参数表分配完毕之后,再根据方法体内定义的变量的顺序和作用域分配。
我们知道类变量表有两次初始化的机会,第一次是在“准备阶段”,执行系统初始化,对类变量设置零值,另一次则是在“初始化”阶段,赋予程序员在代码中定义的初始值。
和类变量初始化不同的是,局部变量表不存在系统初始化的过程,这意味着一旦定义了局部变量则必须人为的初始化,否则无法使用。(局部变量表存储局部变量的数值或地址值)
public void test(){
int i;
System. out. println(i);
}
Variable 'i' might not have been initialized
在栈帧中,与性能调优关系最为密切的部分就是前面提到的局部变量表。在方法执行时,虚拟机使用局部变量表完成方法的传递。
局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收