# 新页面
**字节码指令**
Java虚拟机的指令由一个字节长度的,代表某种特定操作含义的数字,称之为操作码,以及跟随其后的零至多个代表此操作所需参数的操作数而构成。操作码的长度为1个字节,因此最大只有256个。基于栈的指令集架构加载和存储指令
加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。将一个局部变量加载到操作栈:iload、iload\_<n>、lload、lload\_<n>、fload、fload\_<n>、dload、dload\_<n>、aload、aload\_<n>。将一个数值从操作数栈存储到局部变量表:istore、istore\_<n>、lstore、lstore\_<n>、fstore、fstore\_<n>、dstore、dstore\_<n>、astore、astore\_<n>。将一个变量加载到操作数栈:bipush、sipush、ldc、ldc\_w、ldc2\_w、aconst\_null、iconst\_m1、iconst\_<i>、lconst\_<l>、fconst\_<f>、dconst\_<d>。扩充局部变量表的访问索引的指令:wide\_<n>都是某个带有一个操作数的通用指令的特殊形式,它们省略了显示的操作数,不需要进行取操作数的动作,因为实际上操作数就隐含在指令中。运算指令
用于对两个操作数栈上的值进行某种特定运算,并把结构重新存入到操作栈顶。加法指令:iadd、ladd、fadd、dadd减法指令:isub、lsub、fsub、dsub乘法指令:imul、lmul、fmul、dmul除法指令:idiv、ldiv、fdiv、ddiv求余指令:irem、lrem、frem、drem取反指令:ineg、lneg、fneg、dneg位移指令:ishl、ishr、iushr、lshl、lshr、lushr按位或指令:ior、lor按位与指令:iand、land按位异或指令:ixor、lxor局部变量自增指令:iinc比较指令:dcmpg、dcmpl、fcmpg、fcmpl、lcmp类型转换指令
类型转换指令可以将两种不同的数值类型相互转换。宽化类型转换:int类型到long、float或者doule类型long类型到float、doublefloat类型到double窄化类型转换:i2b、i2c、i2s、l2i、f2i、f2l、d2i、d2l、d2f。对象创建与访问指令
创建类实例指令:
new创建数组指令:newarray、anewarray、multianewarray访问类字段(类变量)和实例字段(实例变量)指令:getfield、putfield、getstatic、putstatic把一个数组元素加载到操作数栈指令:baload、caload、saload、iaload、laload、faload、daload、aaload将一个操作数栈的值储存到数组元素中指令:bastore、castore、sastore、iastore、fastore、dastore、aastore取数组长度的指令:arraylength检查类实例类型指令:instanceof、checkcast操作数栈管理指令
将操作数栈的栈顶一个或两个元素出栈:pop、pop2复制栈顶一个或两个数值并将复制值或双份的复制值重新压入栈顶:dup、dup2、dup\_x1、dup2\_x1、dup\_x2、dup2\_x2将栈最顶端的两个数值互换:swap控制转义指令
条件分支:ifeq、iflt、ifle、ifne、ifgt、ifge、ifnull、ifnonnull、if\_icmpeq、if\_icmpne、if\_icmplt、if\_icmpgt、if\_icmple、if\_icmpge、if\_acmpeq、if\_acmpne复合条件分支:tableswitch、lookupswitch无条件分支:goto、goto\_w、jsr、jsr\_w、ret方法调用和返回指令
invokevirtual指令:用于调用对象的实例方法,根据对象的实际类型进行分派。invokeinterface指令:用于调用接口方法,它会在运行时搜索一个实现了这个接口方法的对象,找出适合的方法进行调用。invokespecial指令:用于调用一些需要特殊处理的实例方法,包括实例初始化方法、私有方法和分类方法invokestatic指令:用于调用类静态方法invokedynamic指令:用于在运行时动态解析出调用点限定符所引用的方法。异常处理指令
athrow同步指令
方法级的同步:隐式的,无须通过字节码指令控制,它实现在方法调用和返回操作之中。(方法访问标识ACC\_SYNCHRONIZED)代码块的同步:monitorentermonitorexit