一、加载与存储指令

1.1、加载常量到操作数栈

类别指令作用常量范围 / 说明Java 代码示例字节码示例
int 常量iconst_m1加载 int 常量 -1仅 -1int a = -1;iconst_m1
istore_1
iconst_0加载 int 常量 0仅 0int b = 0;iconst_0
istore_2
iconst_5加载 int 常量 5仅 5int c = 5;iconst_5
istore_3
bipush加载 8 位有符号 int 常量-128~127int d = 100;bipush 100
istore_4
sipush加载 16 位有符号 int 常量-32768~32767int e = 2000;sipush 2000
istore_5
ldc从常量池加载 int超出sipush范围的 intint f = 40000;ldc #2
istore_6
long 常量lconst_0加载 long 常量 0L仅 0Llong g = 0L;lconst_0
lstore_7
lconst_1加载 long 常量 1L仅 1Llong h = 1L;lconst_1
lstore_9
ldc2_w从常量池加载 long超出lconst范围的 longlong i = 1000L;ldc2_w #3
lstore_11
float 常量fconst_0加载 float 常量 0.0f仅 0.0ffloat j = 0.0f;fconst_0
fstore_13
fconst_2加载 float 常量 2.0f仅 2.0ffloat k = 2.0f;fconst_2
fstore_14
ldc从常量池加载 float超出fconst范围的 floatfloat l = 3.14f;ldc #4
fstore_15
double 常量dconst_0加载 double 常量 0.0仅 0.0double m = 0.0;dconst_0
dstore_16
dconst_1加载 double 常量 1.0仅 1.0double n = 1.0;dconst_1
dstore_18
ldc2_w从常量池加载 double超出dconst范围的 doubledouble o = 3.1415;ldc2_w #5
dstore_20
字符串常量ldc从常量池加载字符串所有字符串常量String p = "hello";ldc #6
astore_22

1.2、从局部变量表加载到操作数栈

数据类型简化指令(索引 0~3)通用指令(任意索引)作用Java 代码示例字节码示例
intiload_1iload <n>加载 int 变量int q = d;(d 在索引 4)iload_4
istore_23
longlload_1lload <n>加载 long 变量long r = i;(i 在索引 11)lload 11
lstore_24
floatfload_2fload <n>加载 float 变量float s = l;(l 在索引 15)fload_15
fstore_26
doubledload_3dload <n>加载 double 变量double t = o;(o 在索引 20)dload 20
dstore_27
引用类型aload_0aload <n>加载对象引用(如thisObject u = this;aload_0
astore_29
引用类型aload_1aload <n>加载对象引用String v = p;(p 在索引 22)aload_22
astore_30

1.3、从操作数栈存储到局部变量表

数据类型简化指令(索引 0~3)通用指令(任意索引)作用Java 代码示例字节码示例
intistore_1istore <n>存储 int 值int w = 10;bipush 10
istore_31
longlstore_2lstore <n>存储 long 值long x = 100000L;ldc2_w #7
lstore 32
floatfstore_3fstore <n>存储 float 值float y = 5.5f;ldc #8
fstore_34
doubledstore_0dstore <n>存储 double 值double z = 9.9;ldc2_w #9
dstore_35
引用类型astore_1astore <n>存储对象引用Object obj = new Object();new #10
dup
invokespecial #11
astore_37

1.4、宽索引指令

指令作用说明Java 代码示例字节码示例
wide扩展局部变量表索引范围支持索引≥256 的变量int arr[] = new int[300];
int val = arr[256];(假设 val 在索引 256)
wide iload 256
istore 38

二、运算指令

2.1、算术运算指令(对操作数栈中的数值执行算术操作)

数据类型指令作用说明Java 代码示例字节码示例
intiadd加法栈顶两 int 相加,结果入栈int a = 2 + 3;iconst_2
iconst_3
iadd
istore_1
isub减法栈顶两 int 相减,结果入栈int b = 5 - 1;iconst_5
iconst_1
isub
istore_2
imul乘法栈顶两 int 相乘,结果入栈int c = 3 * 4;iconst_3
iconst_4
imul
istore_3
idiv除法栈顶两 int 相除,结果入栈int d = 10 / 2;bipush 10
iconst_2
idiv
istore_4
irem取余栈顶两 int 取余,结果入栈int e = 7 % 3;bipush 7
iconst_3
irem
istore_5
ineg取反栈顶 int 取相反数,结果入栈int f = -a;iload_1
ineg
istore_6
longladd加法栈顶两 long 相加,结果入栈long g = 100L + 200L;ldc2_w #2
ldc2_w #3
ladd
lstore_7
lsub减法栈顶两 long 相减,结果入栈long h = 500L - 150L;ldc2_w #4
ldc2_w #5
lsub
lstore_9
lmul乘法栈顶两 long 相乘,结果入栈long i = 10L * 30L;lconst_10
ldc2_w #6
lmul
lstore_11
floatfadd加法栈顶两 float 相加,结果入栈float j = 2.5f + 1.5f;ldc #7
ldc #8
fadd
fstore_13
fsub减法栈顶两 float 相减,结果入栈float k = 5.0f - 2.3f;fconst_5
ldc #9
fsub
fstore_14
doubledadd加法栈顶两 double 相加,结果入栈double l = 3.14 + 2.71;ldc2_w #10
ldc2_w #11
dadd
dstore_15
ddiv除法栈顶两 double 相除,结果入栈double m = 10.0 / 3.0;ldc2_w #12
ldc2_w #13
ddiv
dstore_17

2.2、位运算指令(对操作数栈中的整数执行位操作)

数据类型指令作用说明Java 代码示例字节码示例
intishl左移栈顶两 int,低位移高,结果入栈int n = 8 << 2;bipush 8
iconst_2
ishl
istore_19
ishr算术右移带符号右移,高位补符号位int o = -8 >> 2;bipush -8
iconst_2
ishr
istore_20
iushr逻辑右移无符号右移,高位补 0int p = 8 >>> 2;bipush 8
iconst_2
iushr
istore_21
iand按位与栈顶两 int 按位与,结果入栈int q = 3 & 5;iconst_3
iconst_5
iand
istore_22
ior按位或栈顶两 int 按位或,结果入栈int r = 3 | 5;iconst_3
iconst_5
ior
istore_23
ixor按位异或栈顶两 int 按位异或,结果入栈int s = 3 ^ 5;iconst_3
iconst_5
ixor
istore_24
longlshl左移栈顶两 long 左移,结果入栈long t = 4L << 3;lconst_4
iconst_3
lshl
lstore_25
land按位与栈顶两 long 按位与,结果入栈long u = 0x0FL & 0xF0L;ldc2_w #14
ldc2_w #15
land
lstore_27

2.3、比较运算指令(比较操作数栈中的值,结果用于控制流转)

数据类型指令作用说明Java 代码示例字节码示例
intif_icmpeq相等则跳转比较两 int,相等则跳转到指定偏移量if(a == b) { ... }iload_1
iload_2
if_icmpeq 30
if_icmpne不等则跳转比较两 int,不等则跳转if(a != b) { ... }iload_1
iload_2
if_icmpne 40
if_icmplt小于则跳转比较两 int,前者小于后者则跳转if(a < b) { ... }iload_1
iload_2
if_icmplt 50
if_icmpgt大于则跳转比较两 int,前者大于后者则跳转if(a > b) { ... }iload_1
iload_2
if_icmpgt 60
longlcmpeq相等则跳转比较两 long,相等则跳转if(g == h) { ... }lload_7
lload_9
lcmpeq 70
floatfcmpl比较后压栈比较两 float,结果(-1/0/1)入栈(NaN 视为小于)if(j < k) { ... }fload_13
fload_14
fcmpl
iflt 80
fcmpg比较后压栈比较两 float,结果(-1/0/1)入栈(NaN 视为大于)if(j > k) { ... }fload_13
fload_14
fcmpg
ifgt 90
引用类型if_acmpeq引用相等则跳转比较两对象引用,地址相同则跳转if(obj1 == obj2) { ... }aload_28
aload_29
if_acmpeq 100
if_acmpne引用不等则跳转比较两对象引用,地址不同则跳转if(obj1 != obj2) { ... }aload_28
aload_29
if_acmpne 110

三、对象操作指令

3.1、对象创建与初始化指令

指令作用说明Java 代码示例字节码示例
new创建类实例在堆中分配对象实例空间,返回对象引用(未初始化)Person p = new Person();new #2 <Person>
dup
invokespecial #3 <Person.<init>>
astore_1
invokespecial调用构造方法用于初始化对象(调用<init>方法)隐含在new表达式中同上(invokespecial为构造方法调用)

3.2、字段访问指令

指令作用说明Java 代码示例字节码示例
getfield获取对象实例字段值从对象中读取实例变量的值String name = p.name;aload_1
getfield #4 <Person.name>
astore_2
putfield设置对象实例字段值向对象的实例变量写入值p.age = 20;aload_1
bipush 20
putfield #5 <Person.age>
getstatic获取类静态字段值读取类的静态变量(类级变量)int count = Person.total;getstatic #6 <Person.total>
istore_3
putstatic设置类静态字段值写入类的静态变量Person.total = 100;bipush 100
putstatic #6 <Person.total>

3.3、数组操作指令

指令作用说明Java 代码示例字节码示例
newarray创建基本类型数组用于创建 int、float 等基本类型数组int[] arr = new int[5];iconst_5
newarray int
astore_4
anewarray创建引用类型数组用于创建对象数组(如 String [])String[] strs = new String[3];iconst_3
anewarray #7 <java/lang/String>
astore_5
multianewarray创建多维数组用于创建二维及以上数组int[][] matrix = new int[2][3];iconst_2
iconst_3
multianewarray #8 <[[I> 2
astore_6
arraylength获取数组长度将数组长度压入操作数栈int len = arr.length;aload_4
arraylength
istore_7
iaload读取 int 数组元素从 int 数组指定索引读取值int val = arr[0];aload_4
iconst_0
iaload
istore_8
iastore写入 int 数组元素向 int 数组指定索引写入值arr[1] = 100;aload_4
iconst_1
bipush 100
iastore
aaload读取引用数组元素从对象数组指定索引读取引用String s = strs[0];aload_5
iconst_0
aaload
astore_9
aastore写入引用数组元素向对象数组指定索引写入引用strs[1] = "hello";aload_5
iconst_1
ldc #9 <hello>
aastore

3.4、类型检查指令

指令作用说明Java 代码示例字节码示例
instanceof检查对象类型判断对象是否为指定类的实例,结果(1/0)入栈boolean isPerson = obj instanceof Person;aload_10
instanceof #2 <Person>
istore_11
checkcast类型转换检查确保对象可转换为目标类型,失败抛 ClassCastExceptionPerson p2 = (Person) obj;aload_10
checkcast #2 <Person>
astore_12

四、方法调用与返回指令

4.1、方法调用指令

指令作用说明Java 代码示例字节码示例
invokestatic调用静态方法调用类的静态方法(无实例参与),属于静态绑定Math.max(3, 5);iconst_3
iconst_5
invokestatic #2 <java/lang/Math.max>
invokespecial调用特殊方法用于调用构造方法(<init>)、私有方法、父类方法,属于静态绑定super();(构造方法中)aload_0
invokespecial #3 <java/lang/Object.<init>>
this.privateMethod();aload_0
invokespecial #4 <Person.privateMethod>
invokevirtual调用实例方法调用对象的实例方法(非私有、非构造方法),支持动态绑定(多态)p.getName();aload_1
invokevirtual #5 <Person.getName>
invokeinterface调用接口方法调用接口中定义的方法,动态绑定到实现类list.add("item");aload_2
ldc #6 <item>
invokeinterface #7 <java/util/List.add> 2
invokedynamic调用动态方法支持动态语言特性(如 Lambda 表达式),绑定逻辑由引导方法决定Runnable r = () -> {};invokedynamic #8 <run, BootstrapMethod #0>

4.2、方法返回指令

指令作用说明Java 代码示例字节码示例
return无返回值返回用于void方法,无值返回void greet() { return; }return
ireturn返回 int 类型从方法返回 int 值(包括 boolean、byte、char、short 的包装返回)int getAge() { return 20; }bipush 20
ireturn
lreturn返回 long 类型从方法返回 long 值long getTimestamp() { return 123456L; }ldc2_w #9
lreturn
freturn返回 float 类型从方法返回 float 值float getScore() { return 95.5f; }ldc #10
freturn
dreturn返回 double 类型从方法返回 double 值double getPrice() { return 19.99; }ldc2_w #11
dreturn
areturn返回引用类型从方法返回对象或数组引用String getName() { return name; }aload_0
getfield #12 <Person.name>
areturn

五、控制转移指令

5.1、条件分支指令(基于比较结果跳转)

指令作用说明Java 代码示例字节码示例
int 值比较if_icmpeq两 int 相等则跳转if(a == b) { ... }iload_1
iload_2
if_icmpeq 20
if_icmpne两 int 不等则跳转if(a != b) { ... }iload_1
iload_2
if_icmpne 30
if_icmplt前 int < 后 int 则跳转if(a < b) { ... }iload_1
iload_2
if_icmplt 40
if_icmpgt前 int > 后 int 则跳转if(a > b) { ... }iload_1
iload_2
if_icmpgt 50
if_icmple前 int <= 后 int 则跳转if(a <= b) { ... }iload_1
iload_2
if_icmple 60
if_icmpge前 int >= 后 int 则跳转if(a >= b) { ... }iload_1
iload_2
if_icmpge 70
引用比较if_acmpeq两引用相等则跳转if(obj1 == obj2) { ... }aload_3
aload_4
if_acmpeq 80
if_acmpne两引用不等则跳转if(obj1 != obj2) { ... }aload_3
aload_4
if_acmpne 90
栈顶值判断ifeq栈顶 int 为 0 则跳转if(flag == 0) { ... }iload_5
ifeq 100
ifne栈顶 int 不为 0 则跳转if(flag != 0) { ... }iload_5
ifne 110
iflt栈顶 int < 0 则跳转if(count < 0) { ... }iload_6
iflt 120
ifgt栈顶 int > 0 则跳转if(count > 0) { ... }iload_6
ifgt 130
null 判断ifnull引用为 null 则跳转if(obj == null) { ... }aload_3
ifnull 140
ifnonnull引用非 null 则跳转if(obj != null) { ... }aload_3
ifnonnull 150

5.2、无条件分支指令(直接跳转)

指令作用说明Java 代码示例字节码示例
goto无条件跳转到指定偏移量短偏移量跳转(16 位偏移)loop: { ...; goto loop; }goto 5(跳转到偏移量 5)
goto_w无条件跳转到宽偏移量长偏移量跳转(32 位偏移,支持更大范围)大型循环或跳转距离远时goto_w 1000(跳转到偏移量 1000)

5.3、多分支跳转指令(switch 语句专用)

指令作用说明Java 代码示例字节码示例
tableswitch连续 case 值的多分支跳转适用于 case 值连续的 switch,通过索引表快速定位switch(a) { case 1: ...; case 2: ...; }tableswitch
1: 20
2: 30
default: 40
lookupswitch离散 case 值的多分支跳转适用于 case 值不连续的 switch,通过查找表匹配switch(b) { case 10: ...; case 200: ...; }lookupswitch
10: 50
200: 60
default: 70

5.4、异常处理指令

指令作用说明Java 代码示例字节码示例
athrow抛出异常将操作数栈顶的异常对象抛出throw new Exception();new #8 <java/lang/Exception>
dup
invokespecial #9 <Exception.<init>>
athrow

六、栈操作与同步指令

6.1、栈操作指令(直接操作操作数栈)

指令作用说明Java 代码示例字节码示例
pop弹出栈顶 1 个元素用于清理操作数栈中不再使用的单元素(如 int、float、引用)临时变量运算后清理iconst_1
iconst_2
iadd
pop(丢弃结果)
pop2弹出栈顶 2 个元素用于清理占 2 个 Slot 的元素(long、double)或连续 2 个单元素清理 long 类型临时值lconst_1
pop2(丢弃 long 值)
dup复制栈顶 1 个元素并压入栈复制单元素(如 int、引用),栈深度 + 1对象创建时复制引用new #2 <Person>
dup(复制对象引用)invokespecial #3 <Person.<init>>
dup_x1复制栈顶元素并插入到下方第 2 个元素前调整栈结构,复制后顺序:[原栈顶 - 1, 复制值,原栈顶]复杂运算时调整操作数顺序iconst_1
iconst_2
dup_x1(栈变为 [1,2,1])
dup_x2复制栈顶元素并插入到下方第 3 个元素前支持下方是单元素或 long/double(占 2 个 Slot)多操作数调整iconst_1
iconst_2
iconst_3
dup_x2(栈变为 [1,3,2,3])
dup2复制栈顶 2 个元素并压入栈复制 long/double 或两个单元素,栈深度 + 2复制 long 类型值lconst_1
dup2(栈变为 [1L,1L])
dup2_x1复制栈顶 2 个元素并插入到下方第 3 个元素前调整包含 long/double 的栈结构复杂 long 运算调整lconst_1
iconst_2
dup2_x1(栈变为 [1L,2,1L])
dup2_x2复制栈顶 2 个元素并插入到下方第 4 个元素前最灵活的双元素复制指令多类型混合调整iconst_1
lconst_2
dup2_x2(栈变为 [1,2L,1,2L])
swap交换栈顶两个单元素仅用于两个单元素(如 int、引用),不支持 long/double交换操作数顺序iconst_1
iconst_2
swap(栈变为 [2,1])

6.2、同步指令(实现 synchronized 同步)

指令作用说明Java 代码示例字节码示例
monitorenter获取对象监视器锁进入同步块时获取锁,同一时间仅一个线程可获取synchronized(obj) { ... }aload_1
monitorenter
monitorexit释放对象监视器锁退出同步块时释放锁,确保锁最终会被释放(包括异常路径)同步块结束处monitorexit
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]