JVM指令分析
代码:
1 public class AppGo{
2 public static void test() {
3 boolean flag = true;
4 if (flag) System.out.println("Hello, Java!");
5 if (flag == true) System.out.println("Hello, JVM!");
6 }
7 }
javac -g AppGo.java
javap -p -v AppGo.class
Classfile /code/asmtoolsTest/AppGo.class
Last modified 2020-11-16; size 549 bytes
MD5 checksum 080f0b86a8d6f3f00b616181e3b05973
Compiled from "AppGo.java"
public class AppGo
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #7.#21 // java/lang/Object."<init>":()V
#2 = Fieldref #22.#23 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #24 // Hello, Java!
#4 = Methodref #25.#26 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = String #27 // Hello, JVM!
#6 = Class #28 // AppGo
#7 = Class #29 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 LocalVariableTable
#13 = Utf8 this
#14 = Utf8 LAppGo;
#15 = Utf8 test
#16 = Utf8 flag
#17 = Utf8 Z
#18 = Utf8 StackMapTable
#19 = Utf8 SourceFile
#20 = Utf8 AppGo.java
#21 = NameAndType #8:#9 // "<init>":()V
#22 = Class #30 // java/lang/System
#23 = NameAndType #31:#32 // out:Ljava/io/PrintStream;
#24 = Utf8 Hello, Java!
#25 = Class #33 // java/io/PrintStream
#26 = NameAndType #34:#35 // println:(Ljava/lang/String;)V
#27 = Utf8 Hello, JVM!
#28 = Utf8 AppGo
#29 = Utf8 java/lang/Object
#30 = Utf8 java/lang/System
#31 = Utf8 out
#32 = Utf8 Ljava/io/PrintStream;
#33 = Utf8 java/io/PrintStream
#34 = Utf8 println
#35 = Utf8 (Ljava/lang/String;)V
{
public AppGo();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LAppGo; public static void test();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC 局部变量表 操作数栈
Code:
stack=2, locals=1, args_size=0
0: iconst_1 // 将int型值1入操作数栈 null 1
1: istore_0 // 从操作数栈顶出栈一个int型值存入局部变量0号位置 1 null
2: iload_0 // 从局部变量0号位置加载一个int型值入操作数栈 1 1
3: ifeq 14 // 从操作数栈出栈1个数,跟0比较(ifeq),相等则跳过if后面的语句 1 null
6: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #3 // String Hello, Java!
11: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: iload_0 // 从局部变量0号位置加载一个int型值入操作数栈 1 1
15: iconst_1 // 将int型值1入操作数栈 1 1, 1
16: if_icmpne 27 // 从操作数栈栈顶出2个int,如果不相等(if_icmpne),则跳过if后面的语句 1 null
19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
22: ldc #5 // String Hello, JVM!
24: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 14
line 7: 27
LocalVariableTable:
Start Length Slot Name Signature
2 26 0 flag Z
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 14
locals = [ int ]
frame_type = 12 /* same */
}
SourceFile: "AppGo.java"
代码:只有main函数
1 public class App{
2 public static void main(String[] args) {
3 boolean flag = true;
4 if (flag) System.out.println("Hello, Java!");
5 if (flag == true) System.out.println("Hello, JVM!");
6 }
7 }
javap -p -v App.class
Classfile /code/asmtoolsTest/App.class
Last modified 2020-11-16; size 607 bytes
MD5 checksum 9b49845cb53676cdb7e8bdd478ffd9b9
Compiled from "App.java"
public class App
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #7.#24 // java/lang/Object."<init>":()V
#2 = Fieldref #25.#26 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #27 // Hello, Java!
#4 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = String #30 // Hello, JVM!
#6 = Class #31 // App
#7 = Class #32 // java/lang/Object
#8 = Utf8 <init>
#9 = Utf8 ()V
#10 = Utf8 Code
#11 = Utf8 LineNumberTable
#12 = Utf8 LocalVariableTable
#13 = Utf8 this
#14 = Utf8 LApp;
#15 = Utf8 main
#16 = Utf8 ([Ljava/lang/String;)V
#17 = Utf8 args
#18 = Utf8 [Ljava/lang/String;
#19 = Utf8 flag
#20 = Utf8 Z
#21 = Utf8 StackMapTable
#22 = Utf8 SourceFile
#23 = Utf8 App.java
#24 = NameAndType #8:#9 // "<init>":()V
#25 = Class #33 // java/lang/System
#26 = NameAndType #34:#35 // out:Ljava/io/PrintStream;
#27 = Utf8 Hello, Java!
#28 = Class #36 // java/io/PrintStream
#29 = NameAndType #37:#38 // println:(Ljava/lang/String;)V
#30 = Utf8 Hello, JVM!
#31 = Utf8 App
#32 = Utf8 java/lang/Object
#33 = Utf8 java/lang/System
#34 = Utf8 out
#35 = Utf8 Ljava/io/PrintStream;
#36 = Utf8 java/io/PrintStream
#37 = Utf8 println
#38 = Utf8 (Ljava/lang/String;)V
{
public App();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LApp; public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: iconst_1 // 将int型值1入操作数栈
1: istore_1 // 从操作数栈顶出栈一个int型值存入局部变量1号位置
2: iload_1 // 从局部变量1号位置加载一个int型值入操作数栈
3: ifeq 14
6: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
9: ldc #3 // String Hello, Java!
11: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
14: iload_1
15: iconst_1
16: if_icmpne 27
19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
22: ldc #5 // String Hello, JVM!
24: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
27: return
LineNumberTable:
line 4: 0
line 5: 2
line 6: 14
line 7: 27
LocalVariableTable:
Start Length Slot Name Signature
0 28 0 args [Ljava/lang/String;
2 26 1 flag Z
StackMapTable: number_of_entries = 2
frame_type = 252 /* append */
offset_delta = 14
locals = [ int ]
frame_type = 12 /* same */
}
SourceFile: "App.java"
代码:
1 package javap;
2
3 public class FinallyTest {
4
5 public static int test1(int a) {
6 try {
7 a += 20;
8 return a;
9 } finally {
10 a += 30;
11 return a;
12 }
13 }
14
15
16 public static int test2(int b) {
17 try {
18 b += 20;
19 return b;
20 } finally {
21 b += 30;
22 System.out.println("第2个输出=" + b); // 第2个输出
23 }
24 }
25
26 public static void main(String[] args) {
27 int num = 10;
28 System.out.println("第1个输出=" + test1(num)); // 第1个输出
29 System.out.println("第3个输出=" + test2(num)); // 第3个输出
30 }
31
32
33
34 }
Classfile
/code/testDemo/src/main/java/javap/FinallyTest.class
Last modified 2020-11-13; size 1226 bytes
MD5 checksum e4e416c02fb7fec3ea5aef440dd9b403
Compiled from "FinallyTest.java"
public class javap.FinallyTest
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #15.#38 // java/lang/Object."<init>":()V
#2 = Fieldref #39.#40 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Class #41 // java/lang/StringBuilder
#4 = Methodref #3.#38 // java/lang/StringBuilder."<init>":()V
#5 = String #42 // 第2个输出=
#6 = Methodref #3.#43 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#7 = Methodref #3.#44 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
#8 = Methodref #3.#45 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#9 = Methodref #46.#47 // java/io/PrintStream.println:(Ljava/lang/String;)V
#10 = String #48 // 第1个输出=
#11 = Methodref #14.#49 // javap/FinallyTest.test1:(I)I
#12 = String #50 // 第3个输出=
#13 = Methodref #14.#51 // javap/FinallyTest.test2:(I)I
#14 = Class #52 // javap/FinallyTest
#15 = Class #53 // java/lang/Object
#16 = Utf8 <init>
#17 = Utf8 ()V
#18 = Utf8 Code
#19 = Utf8 LineNumberTable
#20 = Utf8 LocalVariableTable
#21 = Utf8 this
#22 = Utf8 Ljavap/FinallyTest;
#23 = Utf8 test1
#24 = Utf8 (I)I
#25 = Utf8 a
#26 = Utf8 I
#27 = Utf8 StackMapTable
#28 = Class #54 // java/lang/Throwable
#29 = Utf8 test2
#30 = Utf8 b
#31 = Utf8 main
#32 = Utf8 ([Ljava/lang/String;)V
#33 = Utf8 args
#34 = Utf8 [Ljava/lang/String;
#35 = Utf8 num
#36 = Utf8 SourceFile
#37 = Utf8 FinallyTest.java
#38 = NameAndType #16:#17 // "<init>":()V
#39 = Class #55 // java/lang/System
#40 = NameAndType #56:#57 // out:Ljava/io/PrintStream;
#41 = Utf8 java/lang/StringBuilder
#42 = Utf8 第2个输出=
#43 = NameAndType #58:#59 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#44 = NameAndType #58:#60 // append:(I)Ljava/lang/StringBuilder;
#45 = NameAndType #61:#62 // toString:()Ljava/lang/String;
#46 = Class #63 // java/io/PrintStream
#47 = NameAndType #64:#65 // println:(Ljava/lang/String;)V
#48 = Utf8 第1个输出=
#49 = NameAndType #23:#24 // test1:(I)I
#50 = Utf8 第3个输出=
#51 = NameAndType #29:#24 // test2:(I)I
#52 = Utf8 javap/FinallyTest
#53 = Utf8 java/lang/Object
#54 = Utf8 java/lang/Throwable
#55 = Utf8 java/lang/System
#56 = Utf8 out
#57 = Utf8 Ljava/io/PrintStream;
#58 = Utf8 append
#59 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#60 = Utf8 (I)Ljava/lang/StringBuilder;
#61 = Utf8 toString
#62 = Utf8 ()Ljava/lang/String;
#63 = Utf8 java/io/PrintStream
#64 = Utf8 println
#65 = Utf8 (Ljava/lang/String;)V
{
public javap.FinallyTest();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ljavap/FinallyTest; public static int test1(int);
descriptor: (I)I
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: iinc 0, 20
3: iload_0
4: istore_1
5: iinc 0, 30
8: iload_0
9: ireturn
10: astore_2
11: iinc 0, 30
14: iload_0
15: ireturn
Exception table:
from to target type
0 5 10 any
LineNumberTable:
line 7: 0
line 8: 3
line 10: 5
line 11: 8
line 10: 10
line 11: 14
LocalVariableTable:
Start Length Slot Name Signature
0 16 0 a I
StackMapTable: number_of_entries = 1
frame_type = 74 /* same_locals_1_stack_item */
stack = [ class java/lang/Throwable ] public static int test2(int);
descriptor: (I)I
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=3, args_size=1
0: iinc 0, 20
3: iload_0
4: istore_1
5: iinc 0, 30
8: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #3 // class java/lang/StringBuilder
14: dup
15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
18: ldc #5 // String 第2个输出=
20: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_0
24: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: iload_1
34: ireturn
35: astore_2
36: iinc 0, 30
39: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
42: new #3 // class java/lang/StringBuilder
45: dup
46: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
49: ldc #5 // String 第2个输出=
51: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
54: iload_0
55: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
58: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
61: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
64: aload_2
65: athrow
Exception table:
from to target type
0 5 35 any
LineNumberTable:
line 18: 0
line 19: 3
line 21: 5
line 22: 8
line 19: 33
line 21: 35
line 22: 39
LocalVariableTable:
Start Length Slot Name Signature
0 66 0 b I
StackMapTable: number_of_entries = 1
frame_type = 99 /* same_locals_1_stack_item */
stack = [ class java/lang/Throwable ] public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: bipush 10
2: istore_1
3: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
6: new #3 // class java/lang/StringBuilder
9: dup
10: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
13: ldc #10 // String 第1个输出=
15: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
18: iload_1
19: invokestatic #11 // Method test1:(I)I
22: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
25: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
28: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
31: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
34: new #3 // class java/lang/StringBuilder
37: dup
38: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
41: ldc #12 // String 第3个输出=
43: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
46: iload_1
47: invokestatic #13 // Method test2:(I)I
50: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
53: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
56: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
59: return
LineNumberTable:
line 27: 0
line 28: 3
line 29: 31
line 30: 59
LocalVariableTable:
Start Length Slot Name Signature
0 60 0 args [Ljava/lang/String;
3 57 1 num I
}
SourceFile: "FinallyTest.java"
代码:
1 package javap;
2
3 public class FinallyTestNotStatic {
4
5 public int test1(int a) {
6 try {
7 a += 20;
8 return a;
9 } finally {
10 a += 30;
11 return a;
12 }
13 }
14
15
16 public int test2(int b) {
17 try {
18 b += 20;
19 return b;
20 } finally {
21 b += 30;
22 System.out.println("第2个输出=" + b); // 第2个输出
23 }
24 }
25
26 public static void main(String[] args) {
27
28 FinallyTestNotStatic finallyTestNotStatic = new FinallyTestNotStatic();
29 int num = 10;
30 System.out.println("第1个输出=" + finallyTestNotStatic.test1(num)); // 第1个输出
31 System.out.println("第3个输出=" + finallyTestNotStatic.test2(num)); // 第3个输出
32 }
33
34 }
MacBook-Pro-2$ javap -p -v FinallyTestNotStatic.class
Classfile /code/testDemo/src/main/java/javap/FinallyTestNotStatic.class
Last modified 2020-11-16; size 1325 bytes
MD5 checksum 19a63de518c165e56e581bd8dae77227
Compiled from "FinallyTestNotStatic.java"
public class javap.FinallyTestNotStatic
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #16.#40 // java/lang/Object."<init>":()V
#2 = Fieldref #41.#42 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Class #43 // java/lang/StringBuilder
#4 = Methodref #3.#40 // java/lang/StringBuilder."<init>":()V
#5 = String #44 // 第2个输出=
#6 = Methodref #3.#45 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#7 = Methodref #3.#46 // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
#8 = Methodref #3.#47 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#9 = Methodref #48.#49 // java/io/PrintStream.println:(Ljava/lang/String;)V
#10 = Class #50 // javap/FinallyTestNotStatic
#11 = Methodref #10.#40 // javap/FinallyTestNotStatic."<init>":()V
#12 = String #51 // 第1个输出=
#13 = Methodref #10.#52 // javap/FinallyTestNotStatic.test1:(I)I
#14 = String #53 // 第3个输出=
#15 = Methodref #10.#54 // javap/FinallyTestNotStatic.test2:(I)I
#16 = Class #55 // java/lang/Object
#17 = Utf8 <init>
#18 = Utf8 ()V
#19 = Utf8 Code
#20 = Utf8 LineNumberTable
#21 = Utf8 LocalVariableTable
#22 = Utf8 this
#23 = Utf8 Ljavap/FinallyTestNotStatic;
#24 = Utf8 test1
#25 = Utf8 (I)I
#26 = Utf8 a
#27 = Utf8 I
#28 = Utf8 StackMapTable
#29 = Class #56 // java/lang/Throwable
#30 = Utf8 test2
#31 = Utf8 b
#32 = Utf8 main
#33 = Utf8 ([Ljava/lang/String;)V
#34 = Utf8 args
#35 = Utf8 [Ljava/lang/String;
#36 = Utf8 finallyTestNotStatic
#37 = Utf8 num
#38 = Utf8 SourceFile
#39 = Utf8 FinallyTestNotStatic.java
#40 = NameAndType #17:#18 // "<init>":()V
#41 = Class #57 // java/lang/System
#42 = NameAndType #58:#59 // out:Ljava/io/PrintStream;
#43 = Utf8 java/lang/StringBuilder
#44 = Utf8 第2个输出=
#45 = NameAndType #60:#61 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#46 = NameAndType #60:#62 // append:(I)Ljava/lang/StringBuilder;
#47 = NameAndType #63:#64 // toString:()Ljava/lang/String;
#48 = Class #65 // java/io/PrintStream
#49 = NameAndType #66:#67 // println:(Ljava/lang/String;)V
#50 = Utf8 javap/FinallyTestNotStatic
#51 = Utf8 第1个输出=
#52 = NameAndType #24:#25 // test1:(I)I
#53 = Utf8 第3个输出=
#54 = NameAndType #30:#25 // test2:(I)I
#55 = Utf8 java/lang/Object
#56 = Utf8 java/lang/Throwable
#57 = Utf8 java/lang/System
#58 = Utf8 out
#59 = Utf8 Ljava/io/PrintStream;
#60 = Utf8 append
#61 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#62 = Utf8 (I)Ljava/lang/StringBuilder;
#63 = Utf8 toString
#64 = Utf8 ()Ljava/lang/String;
#65 = Utf8 java/io/PrintStream
#66 = Utf8 println
#67 = Utf8 (Ljava/lang/String;)V
{
public javap.FinallyTestNotStatic();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Ljavap/FinallyTestNotStatic; public int test1(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=1, locals=4, args_size=2
0: iinc 1, 20
3: iload_1
4: istore_2
5: iinc 1, 30
8: iload_1
9: ireturn
10: astore_3
11: iinc 1, 30
14: iload_1
15: ireturn
Exception table:
from to target type
0 5 10 any
LineNumberTable:
line 7: 0
line 8: 3
line 10: 5
line 11: 8
line 10: 10
line 11: 14
LocalVariableTable:
Start Length Slot Name Signature
0 16 0 this Ljavap/FinallyTestNotStatic;
0 16 1 a I
StackMapTable: number_of_entries = 1
frame_type = 74 /* same_locals_1_stack_item */
stack = [ class java/lang/Throwable ] public int test2(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
stack=3, locals=4, args_size=2
0: iinc 1, 20
3: iload_1
4: istore_2
5: iinc 1, 30
8: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
11: new #3 // class java/lang/StringBuilder
14: dup
15: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
18: ldc #5 // String 第2个输出=
20: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
23: iload_1
24: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
27: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: iload_2
34: ireturn
35: astore_3
36: iinc 1, 30
39: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
42: new #3 // class java/lang/StringBuilder
45: dup
46: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
49: ldc #5 // String 第2个输出=
51: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
54: iload_1
55: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
58: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
61: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
64: aload_3
65: athrow
Exception table:
from to target type
0 5 35 any
LineNumberTable:
line 18: 0
line 19: 3
line 21: 5
line 22: 8
line 19: 33
line 21: 35
line 22: 39
LocalVariableTable:
Start Length Slot Name Signature
0 66 0 this Ljavap/FinallyTestNotStatic;
0 66 1 b I
StackMapTable: number_of_entries = 1
frame_type = 99 /* same_locals_1_stack_item */
stack = [ class java/lang/Throwable ] public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=4, locals=3, args_size=1
0: new #10 // class javap/FinallyTestNotStatic
3: dup
4: invokespecial #11 // Method "<init>":()V
7: astore_1
8: bipush 10
10: istore_2
11: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
14: new #3 // class java/lang/StringBuilder
17: dup
18: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
21: ldc #12 // String 第1个输出=
23: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26: aload_1
27: iload_2
28: invokevirtual #13 // Method test1:(I)I
31: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
34: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
37: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
43: new #3 // class java/lang/StringBuilder
46: dup
47: invokespecial #4 // Method java/lang/StringBuilder."<init>":()V
50: ldc #14 // String 第3个输出=
52: invokevirtual #6 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
55: aload_1
56: iload_2
57: invokevirtual #15 // Method test2:(I)I
60: invokevirtual #7 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
63: invokevirtual #8 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
66: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
69: return
LineNumberTable:
line 28: 0
line 29: 8
line 30: 11
line 31: 40
line 32: 69
LocalVariableTable:
Start Length Slot Name Signature
0 70 0 args [Ljava/lang/String;
8 62 1 finallyTestNotStatic Ljavap/FinallyTestNotStatic;
11 59 2 num I
}
SourceFile: "FinallyTestNotStatic.java"
参考文献:
https://zhuanlan.zhihu.com/p/112244233
https://zhuanlan.zhihu.com/p/45050364
https://zhuanlan.zhihu.com/p/45354152
http://zhongmingmao.me/2018/12/15/jvm-basic-native-type/
JVM指令分析的更多相关文章
- 用jvm指令分析String 常量池
其他博友的不同理解方式: http://hi.baidu.com/boywell/item/d5ee5b0cc0af55c875cd3cfd 我们先来看一个类 public class javaPT ...
- JVM原理分析
1 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收 ...
- Java并发编程(五)JVM指令重排
我是不是学了一门假的java...... 引言:在Java中看似顺序的代码在JVM中,可能会出现编译器或者CPU对这些操作指令进行了重新排序:在特定情况下,指令重排将会给我们的程序带来不确定的结果.. ...
- UAVStack JVM监控分析工具:图形化展示采集及分析监控数据
摘要:UAVStack推出的JVM监控分析工具提供基于页面的展现方式,以图形化的方式展示采集到的监控数据:同时提供JVM基本参数获取.内存dump.线程分析.内存分配采样和热点方法分析等功能. 引言 ...
- Day05_22_实例化对象的JVM内存分析
创建对象的 JVM 内存分析 *new 运算符的作用是创建对象,在JVM堆内存中开辟新的内存空间 *方法区内存:在类加载的时候,class字节码文件被加载到该内存空间当中 *栈内存(局部变量):方法代 ...
- [转]JVM指令详解(上)
作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码 助记符 ...
- 实践中的Git常用指令分析
从工作开始,一直都在使用为知笔记(作为程序员需要知道的内容很多---不需要很深入理解,一段时不使用的东西可能就会忘记).但本周一同步不同PC端时,了解到为知会在2017/1/1开始收费! 既然收费了, ...
- JVM性能分析与优化
JVM性能分析与优化: http://www.docin.com/p-757199232.html
- 大数据学习--day13(字符串String--源码分析--JVM内存分析)
字符串String--源码分析--JVM内存分析 String 类的对象 , 是不可变的字符串对象呢 这个不可变很重要,之后要讲的intern()也离不开它的不可变性. https://www.cnb ...
- JVM 指令讲解
挺有意思的 转载记录下 转载自 https://www.cnblogs.com/f1194361820/p/8524666.html 原作者: 房继诺 JVM 指令 1.Demo 2.Clas ...
随机推荐
- C语言基础--逻辑判断和循环
目录 一.储存标识符 1.auto 2.register 3.static 4.const 二.运算符 1.逻辑运算符 2.位运算符 3.运算符 4.三元运算符 三.选择结构 1.if判断 1.1 i ...
- Oracle分区表设置详解
Oracle分区表详解 Oracle建议单表超过2G就需要进行分表,一万数据大概3MB,单表最多分区为1024*1024-1个分区,我感觉够我们使用了哈 废话不多说,上示例,Oracle分表具体sql ...
- CSDN这么公然爬取(piao qie)cnblogs的文章,给钱了吗?
在CSDN网站经常看到有博客转载cnblogs的文章,开始还以为是网友自行转载,后来才发现,这些所谓的转载应该都是机器爬取(piao qie)过去的.不知道cnblogs对此怎么看. 下面看看几个示例 ...
- zabbix 主动模式下报文分析
获取监控项列表 客户端发起请求 3次握手之后,请求监控项列表: {"request":"active checks","host":&quo ...
- 你真的知道吗?catch、finally和return哪个先执行
我的一位朋友前阵子遇到一个问题,问题的核心就是try--catch--finally中catch和finally代码块到底哪个先执.这个问题看起来很简单,当然是"catch先执行.final ...
- 使用 VirtualBox+Vagrant 创建 CentOS7 虚拟机
一.准备工作 1.1 软件下载 VirtualBox:Downloads – Oracle VM VirtualBox Vagrant:Install | Vagrant | HashiCorp De ...
- 【pandas小技巧】--列值的映射
映射列值是指将一个列中的某些特定值映射为另外一些值,常用于数据清洗和转换. 使用映射列值的场景有很多,以下是几种常见的场景: 将字符串类型的列中的某些值映射为数字.例如,将"男"和 ...
- 【RocketMQ】消息的发送
RocketMQ是通过DefaultMQProducer进行消息发送的,它实现了MQProducer接口,MQProducer接口中定义了消息发送的方法,方法主要分为三大类: send同步进行消息发送 ...
- __wakeup()魔术方法绕过(CVE-2016-7124)
__wakeup()魔术方法绕过(CVE-2016-7124) 漏洞简介 在php反序列化数据过程中,如果类中存在__wakeup方法,调用 unserilize() 方法前则先调用__wakeup方 ...
- Flutter系列文章-Flutter 插件开发
在本篇文章中,我们将学习如何开发 Flutter 插件,实现 Flutter 与原生平台的交互.我们将详细介绍插件的开发过程,包括如何创建插件项目.实现方法通信.处理异步任务等.最后,我们还将演示如何 ...