Algorithm/Tip:

Ricky # 589
# 590
# 783 # 653 # 872
# 897
# 965

Review/Share:

JVM Spec Chapter 2.11

指令集摘要

JVM 的指令由代表特定含义的操作码,以及作为参数的0到多个代表特定操作操作数组成。它占有一个字节的长度。JVM 的许多指令不包含操作数,只有一个操作码。
操作数的数量以及长度由操作码决定,如果一个操作数的长度超过一个字节,那么它就会以 big-endian 顺序存储,即高位在前的字节序列。例如:一个无符号的16位整数索引,存储到局部变量表中,会使用两个无符号字节存储,我们把它们命名为 byte1 和 byte2,那么这个无符号的16位整数的值就是:(byte1 << 8) | byte2 。

字节码指令流都是单字节对齐的,只有 lookupswitchtableswitch 例外,它们的一些操作数是在4字节对齐的。
为了让编译后的代码更加紧凑,所以限制 JVM 操作码为一个字节,并且放弃了数据对齐。这样会在一些简单的虚拟机实现中损失一部分性能。一个字节的长度同样也限制了指令集的大小。假设数据没有对齐,虚拟机处理的即时数据超过一个字节时,就需要在运行时从字节流里重建数据结构。