jvm 局部变量表 详解

1.概念

局部变量表(Local Variable Table)
是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在 Java 程序编译为 Class 文件时,就在方法的 Code 属性的 max_locals 数据项中确定了该方法所需要分配的局部变量表的最大容量。

2.实操验证

请看下面一段代码

public class TestStack {
    private String test(long a, String b) {
        byte[] bytes = new byte[6 * 1024 * 1024];
        String str = a + b;
        System.gc();
        return str;
    }
}

javac -g TestStack.java先编译,然后执行javap -c -l -p -v TestStack 输出返汇编信息:
jvm 局部变量表 详解_第1张图片

  • Code: 表明保存在方法的Code属性中。
  • flags: ACC_PRIVATE: 代表私有方法。
  • stack=3, locals=6, args_size=3
    stack : 操作数栈的深度。
    locals : 占用的槽的大小,long,double占2个,其余指针变量和int等占1个。
    args_size: 方法参数,这里多了一个this,所以是3。

下面是具体的局部变量表存储的信息:jvm 局部变量表 详解_第2张图片
Start : 表示从哪个字节码偏移量作用域开始生效。
Length: 表示 到哪个字节码偏移量 作用域结束。

比如:this变量,从0开始到32结束
jvm 局部变量表 详解_第3张图片
表示整this在个方法作用域有效。
在比如: bytes变量: 从6开始到26结束
jvm 局部变量表 详解_第4张图片
6的上一个指令是4,刚好就是把分配好的bytes[] bytes压入操作数栈,从6开始生效。
26 时:执行gc把bytes销毁了,作用域结束。

Slot : 槽信息
jvm 局部变量表 详解_第5张图片
this : 占了第0个槽 ,大小为1 (引用变量占1)。
a : 占了第1到2个槽【下面是从3开始算了】,大小为2(long变量占2)。
以此类推…

Signature : 变量类型签名

以上就是局部变量表 的 全部存储信息。

你可能感兴趣的:(java虚拟机)