

OutOfMemoryError。StackOverflowError。StackOverflowError。public class Demo1 {
public static void main(String[] args) {
int x = 500;
int y = 100;
int a = x / y;
int b = 50;
System.out.println(a + b);
}
}# 编译
javac Demo1.java
# 查看文件内容
javap -v Demo1.class > Demo.txt针对 class 文件的官方描述
Classfile /Users/shadowolf/Demo1.class
Last modified 2019-11-7; size 414 bytes
MD5 checksum ae6fa820973681b35609c75631cb255b
Compiled from "Demo1.java"
public class Demo1
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #5.#14 // java/lang/Object."<init>":()V
#2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Methodref #17.#18 // java/io/PrintStream.println:(I)V
#4 = Class #19 // Demo1
#5 = Class #20 // java/lang/Object
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 Code
#9 = Utf8 LineNumberTable
#10 = Utf8 main
#11 = Utf8 ([Ljava/lang/String;)V
#12 = Utf8 SourceFile
#13 = Utf8 Demo1.java
#14 = NameAndType #6:#7 // "<init>":()V
#15 = Class #21 // java/lang/System
#16 = NameAndType #22:#23 // out:Ljava/io/PrintStream;
#17 = Class #24 // java/io/PrintStream
#18 = NameAndType #25:#26 // println:(I)V
#19 = Utf8 Demo1
#20 = Utf8 java/lang/Object
#21 = Utf8 java/lang/System
#22 = Utf8 out
#23 = Utf8 Ljava/io/PrintStream;
#24 = Utf8 java/io/PrintStream
#25 = Utf8 println
#26 = Utf8 (I)V
{
public Demo1();
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 1: 0
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=5, args_size=1
0: sipush 500
3: istore_1
4: bipush 100
6: istore_2
7: iload_1
8: iload_2
9: idiv
10: istore_3
11: bipush 50
13: istore 4
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_3
19: iload 4
21: iadd
22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
25: return
LineNumberTable:
line 3: 0
line 4: 4
line 5: 7
line 6: 11
line 7: 15
line 8: 25
}
SourceFile: "Demo1.java"Classfile /Users/shadowolf/Demo1.class
Last modified 2019-11-7; size 414 bytes
MD5 checksum ae6fa820973681b35609c75631cb255b
Compiled from "Demo1.java"public class Demo1
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPERConstant pool:
#1 = Methodref #5.#14 // java/lang/Object."<init>":()V
#2 = Fieldref #15.#16 // java/lang/System.out:Ljava/io/PrintStream;
#3 = Methodref #17.#18 // java/io/PrintStream.println:(I)V
#4 = Class #19 // Demo1
#5 = Class #20 // java/lang/Object
#6 = Utf8 <init>
#7 = Utf8 ()V
#8 = Utf8 Code
#9 = Utf8 LineNumberTable
#10 = Utf8 main
#11 = Utf8 ([Ljava/lang/String;)V
#12 = Utf8 SourceFile
#13 = Utf8 Demo1.java
#14 = NameAndType #6:#7 // "<init>":()V
#15 = Class #21 // java/lang/System
#16 = NameAndType #22:#23 // out:Ljava/io/PrintStream;
#17 = Class #24 // java/io/PrintStream
#18 = NameAndType #25:#26 // println:(I)V
#19 = Utf8 Demo1
#20 = Utf8 java/lang/Object
#21 = Utf8 java/lang/System
#22 = Utf8 out
#23 = Utf8 Ljava/io/PrintStream;
#24 = Utf8 java/io/PrintStream
#25 = Utf8 println
#26 = Utf8 (I)Vpublic Demo1();
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 1: 0public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=5, args_size=1
0: sipush 500
3: istore_1
4: bipush 100
6: istore_2
7: iload_1
8: iload_2
9: idiv
10: istore_3
11: bipush 50
13: istore 4
15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
18: iload_3
19: iload 4
21: iadd
22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
25: return
LineNumberTable:
line 3: 0
line 4: 4
line 5: 7
line 6: 11
line 7: 15
line 8: 250: sipush 500: 将500压入操作数栈
序号 本地变量表 0 args 操作数栈 500 3: istore_1: 将500保存到本地变量表1的位置
序号 本地变量表 0 args 1 500 操作数栈 4: bipush 100: 将100压入操作数栈
序号 本地变量表 0 args 1 500 操作数栈 100 6: istore_2: 将100保存到本地变量表2的位置
序号 本地变量表 0 args 1 500 2 100 操作数栈 7: iload_1、8: iload_2: 将本地变量表1、2位置的数据压入操作数栈
序号 本地变量表 0 args 1 500 2 100 操作数栈 100 500 9: idiv: 进行除法运算,并且将结果压入操作数栈
序号 本地变量表 0 args 1 500 2 100 操作数栈 5 10: istore_3: 将5(500/100)保存到本地变量表3的位置
序号 本地变量表 0 args 1 500 2 100 3 5 操作数栈 11: bipush 50: 将50压入操作数栈
序号 本地变量表 0 args 1 500 2 100 3 5 操作数栈 50 13: istore 4: 将50保存到本地变量表4的位置
序号 本地变量表 0 args 1 500 2 100 3 5 4 50 操作数栈 15: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;: 将常量池中#2对应的常量压入操作数栈
序号 本地变量表 0 args 1 500 2 100 3 5 4 50 操作数栈 #2 18: iload_3: 将本地变量表中3位置的数据(5)压入操作数栈
序号 本地变量表 0 args 1 500 2 100 3 5 4 50 操作数栈 5 #2 19: iload 4: 将本地变量表中4位置的数据(50)压入操作数栈
序号 本地变量表 0 args 1 500 2 100 3 5 4 50 操作数栈 50 5 #2 21: iadd: 将栈的前两个元素执行加法操作,并将执行结果(50+5=55)压入操作数栈
序号 本地变量表 0 args 1 500 2 100 3 5 4 50 操作数栈 55 #2 22: invokevirtual #3 // Method java/io/PrintStream.println:(I)V: jvm回根据这个方法的描述,创建新栈帧,方法的参数从操作数栈中弹出,压入虚拟机栈中,然后虚拟机栈会开始执行虚拟机栈最上面的栈帧。
25: return: 执行完毕,返回来继续执行main方法,返回,main方法结束。

