为什么 JVM tableswitch/lookupswitch 指令的格式有 0 和 3 字节之间的填充?
Why does the format of JVM tableswitch/lookupswitch instruction has between 0 and 3 bytes padding?
我理解了tableswitch/lookupswitch的格式。
但是,0 到 3 字节填充的目的是什么?
由于历史原因存在填充。第一个 Java 虚拟机没有 JIT 编译,他们一个一个解释字节码指令。为了让解释器直接从字节码流中读取 32 位偏移量,偏移量是 32 位对齐的——它们的地址是 4 字节的精确倍数。
RISC 处理器(如 SPARC、ARMv5 和更早版本等)只允许对齐内存访问。例如。要使用单个 CPU 指令从内存中读取 32 位值,地址必须是 32 位对齐的。如果地址没有对齐,得到一个 32 位的值需要四次 8 位的内存读取,当然会比较慢。
现在优化没用了
我理解了tableswitch/lookupswitch的格式。 但是,0 到 3 字节填充的目的是什么?
由于历史原因存在填充。第一个 Java 虚拟机没有 JIT 编译,他们一个一个解释字节码指令。为了让解释器直接从字节码流中读取 32 位偏移量,偏移量是 32 位对齐的——它们的地址是 4 字节的精确倍数。
RISC 处理器(如 SPARC、ARMv5 和更早版本等)只允许对齐内存访问。例如。要使用单个 CPU 指令从内存中读取 32 位值,地址必须是 32 位对齐的。如果地址没有对齐,得到一个 32 位的值需要四次 8 位的内存读取,当然会比较慢。
现在优化没用了