概述
Java虚拟机指令由一个字节的操作码或操作数组成。大部分指令都没有支持byte、short、char和boolean的类型。编译器会在编译期或运行期转换为带符号扩展的int类型处理。
指令类型
加载和存储指令
加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传数据。
以下指令t代表i、l、f、d、a,n代表局部变量表的slot位置。
- 将一个局部变量加载到操作栈:tload_.
- 将一个数值从操作数栈存储到局部变量表:tstor_.
- 将一个常量加载到操作数栈:bipush、sipush等
- 扩充局部变量表的访问索引的指令:wide
运算指令
用于对两个操作数栈上的值进行运算,并把结果重新存入到操作帧顶。
- 加法指令:iadd
- 减法指令:isub
- 求余指令:irem
- 取反指令:ineg
- 局部变量自增指令:iinc
- 比较指令:dcmpg
…
类型转换指令
用于两种类型数据显示转换。包括i2b、i2c 、l2i、 f2i、d2i等
对象创建与访问指令
- 创建类实例:new
- 创建数组:newarray
- 访问字段:getfield、setfield、getstatic、putstatic
- 把一个数组元素加载到操作数栈指令:iaload
- 把一个操作数栈的值存储到数组元素的指令:iastore
…
操作数栈管理指令
- 将操作数栈的栈顶一个或两个元素出栈:pop、pop2
- 复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup、dup2
- 将栈顶的两个数值互换:swap
控制转移指令
- 条件分支:ifeq、ifnull …
- 复合条件分支:tableswitch、lookupswitch
- 无条件分支:goto、ret
方法调用和返回指令
- 调用对象实例方法:invokevirtual
- 调用接口方法:invokeinterface
- 调用特殊方法,包括构造器、私有方法和父类方法:invokespecial
- 调用类方法:invokestatic
异常处理指令
athrow
同步指令
虚拟机用monitorenter和monitorexit两条指令支持Synchronized关键字语义。