实战JAVA虚拟机 JVM故障诊断与性能优化(十)---字节码的执行
字节码执行是java虚拟机的重点,就如同汇编语言对于计算机一样重要,字节码对于java虚拟机来说是执行的根本。
执行的基础:Java虚拟机常用指令介绍
常用入栈指令:将常数压入操作数栈,根据数据类型和入栈内容不同,又可以分为const系列、push系列、ldc系列
bipush (8位),sipush (16位)
ldc,ldc_w,long或者double类型 ldw2_w指令
局部变量压栈指令:将给定的局部变量表中的数据压入操作数栈:
xload、xload_n、xaload
出栈装入局部变量表指令
xstore、xstore_n、xastore
通用型操作
NOP:和汇编中nop一样,表示什么都不做
dup:duplicate复制,它会将栈顶元素复制一份并再次压入栈
pop:把一个元素从栈顶弹出
类型转换指令
x2y:x可能是i,f,l,d,y,y可能是i,f,l,d,c,s,b,翻译分别是:
对象/数组操作指令
1、创建指令
new、newarray、anewarray、multianewarray
new:用于创建普通对象
anewarray:用于创建数组
multianewarray:创建多维数组
2、字段访问指令
getfield、putfield:操作实例对象的字段
getstatic、putstatic:操作类的静态字段
3、类型检索指令
checkacast:用于检查类型强制转换是否可以进行,如果可以,那么checkcast指令不会改变操作数栈,否则它会抛出ClassCastException异常
instanceof:用于判断给定对象是否是某一个类的实例,它会将判断结果压入栈
4、数组操作指令
xastore,xaload
比较控制指令
1、比较指令
dcmpg、dcmpl、fcmpg、fcmpl、lcmp
2、条件跳转
ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull
3、比较条件跳转指令
if_icmpeq、if_icmpne、if_icmplt、if_icmpgt、if_icmple、if_icmpge、if_icmpeq、if_acmpne
以字母"i"开头的指令针对int整数操作(包括short和byte),以字符"a"开头的指令表示对象引用的比较。
4、多条件分支跳转
tableswitch:要求多个条件分支值是连续的
lookupswitch:内部存放着各个离散的case-offset
5、无条件跳转
goto
函数调用与返回指令
invokevirtual:虚函数调用,调用对象的实例方法,支持多态
invokeinterface:指接口方法的调用
invokespecial:调用特殊的一些方法,比如构造函数、类的私有方法、父类方法。这些方法都是静态类型绑定的,不会在调用时进行动态派发
invokestatic:调用类的静态方法
invokedynamic:调用动态绑定的方法
同步控制
Java虚拟机提供了monitorenter、monitorexit两条执行来完成临界区的进行和离开操作,