You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:27:00