JVM一(前言)
一、前言
参考官网:https://docs.oracle.com/javase/8/
1.1:JDK组成
1.2:程序运行流程
1.2.1:.java文件
class Student {
private String name = "renwei";
private int age;
private final double money = 100;
private static String b;
private final static String c = "100456mmm";
private static Object object = new Object();
public void fun1() {
System.out.println("qweuiq");
}
public static int fun2(int i1, int i2) {
i1 = 3;
int i = i1 + i2;
Object object = new Object();
return i;
}
public static void main(String[] args) {
System.out.println(fun2(2, 5));
}
}
1.2.2:.class文件
(1):遵循规则
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
说明:
- u4 magic; .class文件标识 (CA FE BA BE)
- u2 minor_version; 版本号 (00 00)
- u2 major_version; 版本号 (00 34)十进制的52
- u2 constant_pool_count; 常量池
常量池:
1 字面量:文本(字符串)、final修饰的属性;
2 符号引用:类、接口、字段、方法的描述或者表示(00 3D )十进制的61
- cp_info constant_pool[constant_pool_count-1]; 常量的数量 61-1=60
(2):结果
(3):反编译:
命令:javap -p -v Student.class >Student.txt
Classfile /F:/Student.class
Last modified 2020-9-1; size 898 bytes
MD5 checksum cf9c7479cd5b973ffa96b1bc92fee471
Compiled from "Student.java"
class Student
minor version: 0
major version: 52
flags: ACC_SUPER
Constant pool:
#1 = Methodref #10.#39 // java/lang/Object."<init>":()V
#2 = String #40 // renwei
#3 = Fieldref #14.#41 // Student.name:Ljava/lang/String;
#4 = Double 100.0d
#6 = Fieldref #14.#42 // Student.money:D
#7 = Fieldref #43.#44 // java/lang/System.out:Ljava/io/PrintStream;
#8 = String #45 // qweuiq
#9 = Methodref #46.#47 // java/io/PrintStream.println:(Ljava/lang/String;)V
#10 = Class #48 // java/lang/Object
#11 = Methodref #14.#49 // Student.fun2:(II)I
#12 = Methodref #46.#50 // java/io/PrintStream.println:(I)V
#13 = Fieldref #14.#51 // Student.object:Ljava/lang/Object;
#14 = Class #52 // Student
#15 = Utf8 name
#16 = Utf8 Ljava/lang/String;
#17 = Utf8 age
#18 = Utf8 I
#19 = Utf8 money
#20 = Utf8 D
#21 = Utf8 ConstantValue
#22 = Utf8 b
#23 = Utf8 c
#24 = String #53 // 100456mmm
#25 = Utf8 object
#26 = Utf8 Ljava/lang/Object;
#27 = Utf8 <init>
#28 = Utf8 ()V
#29 = Utf8 Code
#30 = Utf8 LineNumberTable
#31 = Utf8 fun1
#32 = Utf8 fun2
#33 = Utf8 (II)I
#34 = Utf8 main
#35 = Utf8 ([Ljava/lang/String;)V
#36 = Utf8 <clinit>
#37 = Utf8 SourceFile
#38 = Utf8 Student.java
#39 = NameAndType #27:#28 // "<init>":()V
#40 = Utf8 renwei
#41 = NameAndType #15:#16 // name:Ljava/lang/String;
#42 = NameAndType #19:#20 // money:D
#43 = Class #54 // java/lang/System
#44 = NameAndType #55:#56 // out:Ljava/io/PrintStream;
#45 = Utf8 qweuiq
#46 = Class #57 // java/io/PrintStream
#47 = NameAndType #58:#59 // println:(Ljava/lang/String;)V
#48 = Utf8 java/lang/Object
#49 = NameAndType #32:#33 // fun2:(II)I
#50 = NameAndType #58:#60 // println:(I)V
#51 = NameAndType #25:#26 // object:Ljava/lang/Object;
#52 = Utf8 Student
#53 = Utf8 100456mmm
#54 = Utf8 java/lang/System
#55 = Utf8 out
#56 = Utf8 Ljava/io/PrintStream;
#57 = Utf8 java/io/PrintStream
#58 = Utf8 println
#59 = Utf8 (Ljava/lang/String;)V
#60 = Utf8 (I)V
{
private java.lang.String name;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE
private int age;
descriptor: I
flags: ACC_PRIVATE
private final double money;
descriptor: D
flags: ACC_PRIVATE, ACC_FINAL
ConstantValue: double 100.0d
private static java.lang.String b;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE, ACC_STATIC
private static final java.lang.String c;
descriptor: Ljava/lang/String;
flags: ACC_PRIVATE, ACC_STATIC, ACC_FINAL
ConstantValue: String 100456mmm
private static java.lang.Object object;
descriptor: Ljava/lang/Object;
flags: ACC_PRIVATE, ACC_STATIC
Student();
descriptor: ()V
flags:
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: ldc #2 // String renwei
7: putfield #3 // Field name:Ljava/lang/String;
10: aload_0
11: ldc2_w #4 // double 100.0d
14: putfield #6 // Field money:D
17: return
LineNumberTable:
line 1: 0
line 2: 4
line 4: 10
public void fun1();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #8 // String qweuiq
5: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
LineNumberTable:
line 10: 0
line 11: 8
public static int fun2(int, int);
descriptor: (II)I
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=2
0: iconst_3
1: istore_0
2: iload_0
3: iload_1
4: iadd
5: istore_2
6: new #10 // class java/lang/Object
9: dup
10: invokespecial #1 // Method java/lang/Object."<init>":()V
13: astore_3
14: iload_2
15: ireturn
LineNumberTable:
line 14: 0
line 15: 2
line 16: 6
line 17: 14
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_2
4: iconst_5
5: invokestatic #11 // Method fun2:(II)I
8: invokevirtual #12 // Method java/io/PrintStream.println:(I)V
11: return
LineNumberTable:
line 21: 0
line 22: 11
static {};
descriptor: ()V
flags: ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: new #10 // class java/lang/Object
3: dup
4: invokespecial #1 // Method java/lang/Object."<init>":()V
7: putstatic #13 // Field object:Ljava/lang/Object;
10: return
LineNumberTable:
line 7: 0
}
SourceFile: "Student.java"
说明:
跟上面(1)的说明吻合
- 1.class Student
minor version: 0
major version: 52 52
flags: ACC_SUPER- Constant pool: 60个.....
注:#1 = Methodref #10.#39 // java/lang/Object."<init>":()V 每个类都是object类的子类,所以每个类第一行都是object类的初始化指令
具体了解:https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.4
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。