局部变量表以slot为单位存储数据,每个slot默认32位:int/char/boolean/byte/short/float占1个slot,long/double占2个连续slot,引用类型仅存对象地址;槽位按字节码指令流顺序分配并可复用,生命周期绑定栈帧。

局部变量表用“槽(Slot)”为单位存数据,每个槽默认32位宽,基本类型按宽度占1个或2个槽,不存对象本身,只存值或地址。
基本类型直接存值,按宽度占槽
8种基本类型中:
- int、char、boolean、byte、short、float:各占1个Slot,值直接写入。注意:boolean在字节码中被转为int处理(0表示false,非0表示true);byte/short/char也先提升为int再存储。
- long、double:各占2个连续Slot(因64位宽度),访问时只需指定第一个槽索引。
引用类型只存地址,不存对象
String、ArrayList、自定义对象等,局部变量表中存放的是指向堆内存中对象起始位置的引用值:
- 该引用在HotSpot中通常是一个32位地址(开启压缩指针时)或64位地址(未开启时);
- Object obj = null 或未初始化的 Object obj;,对应槽中存全0比特模式,逻辑上等价于空指针;
- 对象本体始终在堆(或字符串常量池、元空间等特定区域),局部变量表只是“通讯录”,记的是电话号码,不是人。
槽位分配按字节码顺序,可复用
槽索引不是按Java源码书写顺序,而是由javac根据变量在字节码指令流中首次出现的顺序分配:
- 非静态方法的槽0固定存
this引用; - 参数从左到右依次占据后续槽位;
- 方法体内变量按实际使用顺序分配,作用域结束后,其槽可能被后续变量复用(如if块内声明的变量退出后,槽可被新变量重用);
- 这种复用不改变语义,但调试时可能看到变量“突然不可见”,是JVM正常优化行为。
生命周期绑定栈帧,方法结束即销毁
局部变量表随栈帧创建而分配,随方法返回或异常完成而销毁:
- 栈帧弹出后,所有槽内容失效,其中的引用丢失;
- 若该引用是堆中对象唯一的强引用,对象随即进入垃圾回收候选队列;
- static字段或成员变量中的引用不在局部变量表中,不受此影响——它们分别存在方法区和堆的对象实例里。











