From 5ade06ead05ae491b09650715480e838a4596688 Mon Sep 17 00:00:00 2001 From: moralok Date: Thu, 9 Nov 2023 17:36:38 +0000 Subject: [PATCH] Add "some examples of Java bytecode instruction analysis" --- ...s-of-Java-bytecode-instruction-analysis.md | 173 ++++++++++++++++++ .../Snipaste_2023-11-10_00-28-14.png | Bin 0 -> 29226 bytes 2 files changed, 173 insertions(+) create mode 100644 source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis.md create mode 100644 source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis/Snipaste_2023-11-10_00-28-14.png diff --git a/source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis.md b/source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis.md new file mode 100644 index 00000000..bac43031 --- /dev/null +++ b/source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis.md @@ -0,0 +1,173 @@ +--- +title: 关于 Java 字节码指令的一些例子分析 +date: 2023-11-09 23:13:11 +tags: + - Java + - bytecode +--- + + +## 演示字节码指令的执行 + +```java +public class ByteCodeTest_2 { + + public static void main(String[] args) { + int a = 10; + int b = Short.MAX_VALUE + 1; + int c = a + b; + System.out.println(c); + } +} +``` + +### 操作数栈和本地变量表的大小 + +在编译期间就可计算得到操作数栈和本地变量表的大小。 +```console +stack=2, locals=4, args_size=1 +``` + +### 本地变量表 + +Slot,即槽位,可理解为索引。 + +```console +Start Length Slot Name Signature + 0 18 0 args [Ljava/lang/String; + 3 15 1 a I + 6 12 2 b I + 10 8 3 c I +``` + +### 运行时常量池 + +```console +#3 = Integer 32768 +#4 = Fieldref #27.#28 // java/lang/System.out:Ljava/io/PrintStream; +#5 = Methodref #29.#30 // java/io/PrintStream.println:(I)V +``` + +{% asset_img "Snipaste_2023-11-10_00-28-14.png" 字节码指令执行栈帧示意图 %} + +### 字节码指令 + +```console + 0: bipush 10 + 2: istore_1 + 3: ldc #3 // int 32768 + 5: istore_2 + 6: iload_1 + 7: iload_2 + 8: iadd + 9: istore_3 +10: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream; +13: iload_3 +14: invokevirtual #5 // Method java/io/PrintStream.println:(I)V +17: return +``` +- bipush,将一个 byte,推入操作数栈。 + - short 范围内的数是和字节码指令一起存储的,范围外的数是存储在运行时常量池中的。 + - 操作数栈的宽度是 4 个字节,short 范围内的数在推入操作数栈前会经过符号扩展成为 int。 +- istore_1,将栈顶的 int,存入局部变量表,槽位 1。 +- ldc,从运行时常量池中将指定常量推入操作数栈。 +- istore_2,将栈顶的 int,存入局部变量表,槽位 2。 +- iload_1 iload_2,依次从局部变量表将两个 int 推入操作数栈,槽位分别是 1 和 2。 +- iadd,将栈顶的两个 int 弹出并相加,将结果推入操作数栈。 +- istore_3,将栈顶的 int,存入局部变量表,槽位 3。 +- getstatic,获取类的静态属性,推入操作数栈。 +- iload_3,从局部变量表将 int 推入操作数栈,槽位 3。 +- invokevirtual,将栈顶的参数依次弹出,调用实例方法。 +- return,返回 void + +## 分析 a++ 和 ++a + +```java +public class ByteCodeTest_3 { + + public static void main(String[] args) { + int a = 10; + int b = a++ + ++a + a--; + System.out.println(a); + System.out.println(b); + } +} +``` + +### 字节码指令 + +```console + 0: bipush 10 + 2: istore_1 + 3: iload_1 + 4: iinc 1, 1 + 7: iinc 1, 1 +10: iload_1 +11: iadd +12: iload_1 +13: iinc 1, -1 +16: iadd +17: istore_2 +``` + +- a++ 和 ++a 的区别是先 load 还是先 iinc。 +- iinc,将局部变量表指定槽位的数加上一个常数。 +- 注意 a 只 load 到操作数栈并没有 store 回局部变量表。 +- b = 10 + 12 + 12 = 34 +- a = 10 + 1 + 1 - 1 = 11 + +## 分析判断条件 + +```java +public class ByteCodeTest_4 { + + public static void main(String[] args) { + int a = 0; + // ifeq, goto + if (a == 0) { + a = 10; + } else { + a = 20; + } + } +} +``` + +### 字节码指令 +```console + 0: iconst_0 + 1: istore_1 + 2: iload_1 + 3: ifne 12 + 6: bipush 10 + 8: istore_1 + 9: goto 15 +12: bipush 20 +14: istore_1 +15: return +``` + +- iconst,将一个 int 常量推入操作数栈。 +- if``,一个 int 和 0 的比较成立时进入分支,跳转到指定行号。 +- goto,总是进入的分支,跳转到指定行号。 + + + +## 涉及的字节码指令 +- bipush,将一个 byte 符号扩展为一个 int,推入操作数栈。 +- istore,将栈顶的 int,存入局部变量表的指定槽位。 +- iload,将局部变量表指定槽位的 int,推入操作数栈。 +- ldc,从运行时常量池将指定常量推入操作数栈。 +- iadd,将栈顶的两个 int 弹出并相加,将结果推入操作数栈。 +- getstatic,获取类的静态属性,推入操作数栈。 +- invokevirtual,将栈顶的参数依次弹出,调用实例方法。 +- return,返回 void。 +- iinc,将局部变量表中指定槽位的数加一个常量。 +- if``,一个 int 和 0 的比较成立时进入分支,跳转到指定行号。 + - ifeq,equals + - ifne,not equals + - iflt,less than + - ifge,greater than or equals + - ifgt,great than + - ifle,less than or equals +- goto,总是进入的分支,跳转到指定行号。 diff --git a/source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis/Snipaste_2023-11-10_00-28-14.png b/source/_posts/2023-11-09-some-examples-of-Java-bytecode-instruction-analysis/Snipaste_2023-11-10_00-28-14.png new file mode 100644 index 0000000000000000000000000000000000000000..5897a5843c0fdf82531fe7eaad0b5719f0687d42 GIT binary patch literal 29226 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
0ErFv9FR2H!vs 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 literal 0 HcmV?d00001