Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)构成。
引申------操作数栈还是寄存器的架构区别。
操作码的长度为一个字节(0~255)
如果要将一个16位长度的无符号整数使用两个无符号字节存储起来(将它们命名为byte1和byte2),对应的值
(byte1 << 8)| byte2
如果不考虑异常处理,那么Java虚拟机的解释器可以用这个伪代码来理解他的执行原理过程
do{
自动计算PC寄存器的值加1
根据PC寄存器的指示位置,从字节码流中取出操作码;
if(字节码存在操作数)从字节码流中取出操作数;
执行操作码所定义的操作
}while(字节码流长度 > 0)
一、字节码与数据类型
iload指令----》从局部变量表中加载int型的数据到操作数栈。
long-lload,short-sshort,其余同理
arraylength指令,没有代表数据类型的特殊字符,但是操作数永远只能是一个数组类型的对象。还有另外一些指令,如无条件跳转指令goto则是与数据类型无关的。
二、加载和存储指令
三、运算指令
没有直接支持byte/short/char/boolean的统一使用int代替
四、类型转换指令
小范围类型向大范围类型的安全转换
大范围到小范围的窄化
我们经常会遇到在转换的时候由于数值过大而导致上限溢出,下限溢出和精度丢失等情况。但是永远不可能导致虚拟机抛出运行时异常。
五、对象创建与访问指令
六、操作数栈管理指令
七、控制转移指令
各种类型的比较最终都会转化为int类型的比较操作,int类型比较是否方便完善就显得尤为重要。所以Java虚拟机提供的int类型的条件分支是最为丰富和强大的。
八、方法调用和返回指令
九、异常处理指令
十、同步指令
虚拟机的指令集monitorenter和monitorexit两条指令来支持synchronized