详解 JVM 字节码(8)
2019-05-04 本文已影响31人
zidea

字节码的执行方式,
程序执行有两种是编译执行和解释执行,JIT 编译产生本地代码生成机器码来执行。现在的 JVM 解释执行和编译执行结合来运行程序。
- 解释执行,将通过解释器读取字节码遇到相应的指令就该执行该指令
- 编译执行,通过JIT编译器将字节码转换为本地机器码来执行;现代 JVM 会根据代码热点来生成机器码。
stack=2, locals=5, args_size=1
0: iconst_0
1: istore_1
2: iconst_1
3: istore_2
4: iconst_2
5: istore_3
6: iconst_3
7: istore 4
9: iload_2
10: iload_3
11: iadd
12: iload 4
14: imul
15: iload_2
16: isub
17: istore_1
18: iload_1
19: ireturn
- iconst_0 将 result 0 推送到操作数栈顶
- istore_1 将 1 必须是当前栈帧的局部变量的索引,并且栈顶的类型必须为 int 然后将栈顶弹出赋值给局部变量第 1 的变量设置为弹出的值。0 位置局部变量位置为 this。
下面到 6 以此类推
iconst_1 是将 1 入栈 -> 然后 istore_2 是从栈弹出栈顶的1(也就是刚刚入栈的 1)放置到局部变量表(类似数组)的第 2 个位置。

- iload_2 :将索引为 2 的局部变量放置到栈顶,栈顶为 1
- iload_3 :将索引为 3 的局部变量放置到栈顶,栈顶为 2
- iadd :完成 int 加法,不接收参数,参数是从操作数栈顶依次弹出进行完加法重新放置到
栈顶 - iload 4 将索引为 4 的局部变量放置到栈顶
- imul :进行 int 的乘法
... - istore_1 将结构保存到索引为 1 的局部变量也就是(result)