虚拟机字节码指令
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。
一 基本数据类型、加载和存储指令
1、除了long和double类型外,每个变量都占局部变量区中的一个变量槽(slot),而long及double会占用两个连续的变量槽。
2、大多数对于boolean、byte、short和char类型数据的操作,都使用相应的int类型作为运算类型。
加载和存储指令
1、将一个局部变量加载到操作栈;
2、将一个数值从操作数栈存储到局部变量表;
3、将一个常量加载到操作数栈;
存储数据的操作数栈和局部变量表主要就是由加载和存储指令进行操作,除此之外,还有少量指令,如访问对象的字段或数组元素的指令也会向操作数栈传输数据。
二、const系列
该系列命令主要负责把简单的数值类型送到栈顶。
三、push系列
该系列命令负责把一个整形数字(长度比较小)送到到栈顶。
四、ldc系列
该系列命令负责把数值常量或String常量值从常量池中推送至栈顶。
五、load系列
5.1、load系列A
该系列命令负责把本地变量的送到栈顶。
5.2、load系列B
该系列命令负责把数组的某项送到栈顶。
六、store系列
6.1、store系列A
该系列命令负责把栈顶的值存入本地变量。
6.2、store系列B
该系列命令负责把栈顶项的值存到数组里。
七、pop系列
该系列命令似乎只是简单对栈顶进行操作,
八、栈顶元素数学操作及移位操作系列
该系列命令用于对栈顶元素行数学操作,和对数值进行移位操作。
运算指令
1、运算或算术指令用于对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。
2、算术指令分为两种:整型运算的指令和浮点型运算的指令。
3、无论是哪种算术指令,都使用Java虚拟机的数据类型,由于没有直接支持byte、short、char和boolean类型的算术指令,使用操作int类型的指令代替。
类型转换指令
对象创建与访问指令
创建类实例的指令:new。
创建数组的指令:newarray、anewarray、multianewarray。
操作数栈管理指令
控制转移指令
方法调用和返回指令
invokevirtual 指令用于调用对象的实例方法,根据对象的实际类型进行分派(虚方法分派),这也是Java语言中最常见的方法分派方式。
异常处理指令
在Java程序中显式抛出异常的操作(throw语句)都由athrow指令来实现,除了用throw语句显式抛出异常情况之外,Java虚拟机规范还规定了许多运行时异常会在其他Java虚拟机指令检测到异常状况时自动抛出。
同步指令
方法级同步 方法内部一段指令序列的同步