Java bytecode局部变量槽偏移量2、4被跳过的原因是什么?
问题原因
你观察到的偏移量2、4“被跳过”,本质就是JVM局部变量表的槽位分配规则导致的,和你代码里的double类型使用直接相关,没有其他特殊原因。
具体规则说明
JVM的局部变量表以32位长度的slot(槽)为最小分配单位:
- 除
long和double之外的所有数据类型,都只占用1个slot long和double是64位长度的基础类型,必须占用连续的2个slot
对应你的代码槽位分配拆解
你提供的run是实例方法,槽位分配顺序如下:
- slot 0:固定存储实例方法的
this引用,占1个slot,slot 0被占用 - slot 1、slot 2:方法入参
param是double类型,需要连续2个slot,所以这两个槽都属于param,你看到的“被跳过的slot2”就是param的第二个存储位 - slot 3、slot 4:局部变量
d是double类型,分配连续的slot3、slot4,“被跳过的slot4”是d的第二个存储位 - slot 5、slot 6:局部变量
k是double类型,分配连续的slot5、slot6,对应字节码里的dstore 5指令
补充说明
因为JVM对double/long类型的操作指令,只需要指定起始slot的编号,就会自动操作该编号+下一个编号的两个连续slot,所以你在字节码里看不到单独操作slot2、slot4的指令,视觉上就会产生这两个槽被跳过的错觉,实际它们已经被分配给前一个double变量使用。
内容的提问来源于stack exchange,提问作者hnnn
相关产品推荐
相关产品推荐

