局部变量表是jvm栈帧中按32位槽组织的连续数组,存储方法参数和局部变量的值或引用;基本类型占1槽,long/double占2槽,引用和returnaddress占1槽;大小编译期确定,方法入口即分配全部空间,通过iload_0等指令直接编号访问,高效无寻址开销。

Java 虚拟机栈帧中的局部变量表,本质上是一块按槽(slot)组织的连续数组,每个槽固定为 32 位宽。它不存储对象本身,只存方法参数和方法体内定义的局部变量的值或引用。
- 基本类型(如
int、boolean、float)的值直接存入对应槽中 -
long和double占用两个连续槽(因 64 位宽度) - 对象引用(reference)是 32 或 64 位的内存地址,也占一个槽,指向堆中实际对象
-
returnAddress类型(用于jsr/ret指令,现已基本弃用)同样占一个槽
局部变量表的大小在编译期就完全确定,并记录在方法的 Code 属性中。JVM 在方法入口就为其分配全部槽空间,不随变量声明位置动态调整——哪怕某个变量只在 if 分支末尾才声明,它占用的槽从方法开始就已预留。
访问方式高度高效:
- 字节码指令如
iload_0、astore_2直接通过编号读写指定槽,无寻址计算、无反射开销 - 所有操作都是寄存器级的值拷贝,不涉及堆内存访问或 GC 干预
值得注意的是:
- 成员变量(字段)不在此处存储,它们属于对象实例数据,位于堆中
- 局部变量表生命周期与栈帧一致,方法调用结束即销毁,不存在线程安全问题
- 参数和显式声明的变量共享同一张表,过多参数会挤占后续变量的槽位,影响栈帧紧凑性
简单说,局部变量表就是 JVM 给每个方法划的一块“寄存器级缓存区”,专供快速存取本地数据。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











