java栈帧的局部变量表只存基本类型值或引用地址,不存对象本身;基本类型按宽度占1或2个slot,引用类型存堆中对象地址或句柄,槽位按字节码顺序分配并可复用,随栈帧销毁而失效。

Java栈帧里的局部变量表,不存对象本身,只存“线索”:基本类型直接放值,引用类型放地址。
基本类型:值直接进槽,占1个或2个Slot
局部变量表以“槽(Slot)”为单位,每个槽默认32位宽。8种基本类型中:
- int、char、boolean、byte、short、float:各占1个Slot,值直接写入
- long、double:各占2个连续Slot(因64位宽度)
- 未赋初值的局部变量(如int a;)在字节码层面不会被访问,JVM不保证其槽内内容;但若显式声明后未初始化就使用,编译器会报错
引用类型:只存地址,对象本体在堆里
String、ArrayList、自定义类实例等,局部变量表中存储的不是对象数据,而是指向堆内存中对象起始位置的引用值:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 该引用在HotSpot中通常表现为一个32位或64位的内存地址(开启压缩指针时多为32位)
- 也可能是句柄——即一个间接层:局部变量表存句柄ID,句柄表再映射到堆中真实地址(现代HotSpot默认用直接指针,句柄方式已极少使用)
- Object obj = null; 或 Object obj;(未初始化)时,对应槽中存全0比特模式,逻辑上等价于空指针
槽位分配与复用:按字节码顺序,非源码顺序
局部变量表大小在编译期就固定,槽索引由javac按字节码指令流中的变量首次出现顺序分配:
- 非静态方法的槽0固定存放this引用
- 方法参数从左到右依次占据后续槽位
- 方法体内变量按实际使用顺序分配,作用域结束后,其槽可能被后续变量复用(例如if块内声明的变量退出后,槽可被新变量重用)
- 这种复用不影响语义,但调试时可能看到“变量突然不可见”,并非bug,而是JVM优化行为
生命周期绑定栈帧:方法结束,表即销毁
局部变量表随栈帧创建而分配,随方法返回或异常完成而销毁:
- 栈帧弹出后,所有槽内容失效,其中的引用丢失
- 若该引用是堆中对象唯一的强引用,对象随即进入垃圾回收候选队列
- static字段或成员变量中的引用不在局部变量表中,不受此影响——它们分别存在方法区和堆的对象实例里
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










