【局部变量表中的起始PC】今天在学JVM内存结构中的局部变量表和操作数栈,写了一个测试方法:
public void testAdd(){
byte i = 15;
int j = 8;
int k = i + j;
}
大家知道局部变量表最基本的存储单元是 Slot(变量槽)。一个槽32位,也就是一个int或float的长度,比int短的数据类型比如byte,short等也都是统一转换为int,占用一个槽。因为这里是非静态方法,局部变量表的0位置默认会保存this。i,j,k分别保存在1,2,3的位置。

文章图片
我当时看到这里的起始PC,就很好奇是什么东西,然后我就看了看程序的字节码:

文章图片
当时第一反应是i变量不是在0的位置开始初始化嘛,怎么会起始时3呢,然后一想不对,原来这里的起始PC是这个变量生命周期开始的指令地址,也就是说i变量在字节码执行完istore_1(意思是讲操作栈顶的元素15保存到局部变量表1的位置),这时候局部变量表里才有i,也就是i变量才正式的完成初始化。这时候我又好奇,放进slot的值是15,但是怎么知道它对应的是i这个变量呢,百度一查,原来局部变量表会为每个slot建立索引,通过这个索引即可成功访问到局部变量表中指定的局部变量值,索引值的范围从 0 开始到局部变量表最大的 Slot 数量。实在是妙啊~
推荐阅读
- 京东一面(说说 CompletableFuture 的实现原理和使用场景(我懵了。。))
- 程序人生|面试字节跳动,我被怼了。
- java|码神之路博客项目部署
- 笔记|纯手写SpringFramework-第二代(原创)
- Java|云原生DevOps(k8s/docker/springcloudalibaba)
- #|【多线程】多线程的“前世”,“今生”与“未来”
- #|【多线程】线程池ThreadPoolExecutor(全面详解)
- 数据结构|回顾下接雨水问题
- 蓝桥杯|2021模拟赛 跳跃 java_dfs_动态规划