- Java虚拟机的指令由一个字节长度的,代表着某种特定操作含义的数字以及跟随其后的零至多个代表此操作所需参数而构成
字节码操作按用途大致分为9类:
一 加载和存储指令
用于将数据在栈帧中的局部变量表和操作数栈之间来回传输,包括以下内容:
- 将一个局部变量加载到操作栈
- 将一个数值从操作数栈存储到局部变量表
- 将一个常量加载到操作数栈
- 扩充局部变量表的访问索引的指令
<>结尾的代表了一组指令,存储数据的操作数栈和局部变量表主要就是由加载和存储指令进行操作
二 运算指令
用于对两个操作数栈上的值进行某种特定的运算,并把结果重新存入到操作栈顶
算数指令大致分为两种:
- 对整型数据进行运算的指令
- 对浮点型数据进行运算的指令
三 类型转换指令
可以将两种不同的数值类型进行相互转换,这些转换操作一般用于实现用户代码中的显式类型转换操作
Java虚拟机直接支持以下数值类型的款划类型转换(小范围类型向大范围类型的安全转换)
- int类型到long,float或者double类型
- long类型到float,double类型
- float类型到double类型
四 对象创建与访问指令
虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建与操作使用了不同的字节码指令,对象创建后,就可以通过对象访问指令获取对象实例或者是数组实例中的字段或者数组元素,包括以下指令:
- 创建类实例的指令:new
- 创建数组的指令:newarray,anewarray,multianewarray
- 访问类字段(也称为类变量static)和实例字段(也成为实例变量非static)的指令
- 把一个数组元素加载到操作数栈的指令
- 把一个操作数栈的值存储到数组元素中的指令
- 取数组长度的指令
- 检查类实例类型的指令
五 操作数栈管理指令
Java虚拟机提供了一些用于直接操作操作数栈的指令
六 控制转移指令
控制转移指令就是在有条件或无条件地修改PC寄存器的值,具体分为:
- 条件分支
- 复合条件分支
- 无条件分支
七 方法调用和返回指令
第八章详解
八 异常处理指令
在Java虚拟机中,处理异常不是由字节码指令来实现的,而是采用异常表来完成的
九 同步指令
Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的
方法级的同步时隐式的,即无需通过字节码指令来控制,它实现在方法调用和返回操作之中
同步一段指令集序列通常是由Java语言中的synchronized语句块来表示的
ps:当方法调用时,调用指令首先先检查访问标志是否被设置了,如果设置了,执行线程就要求先成功持有管程,然后才能执行方法,最后当方法完成时释放管程,在方法执行期间,执行线程持有了管程,其他任何线程都无法再获取到同一个管程