jvm初识
1 官网
1.1 JDK 8
https://docs.oracle.com/javase/8/
1.2 The relation of JDK/JRE/JVM
Reference -> Developer Guides -> 定位到:https://docs.oracle.com/javase/8/docs/index.html


1.3 源码到类文件
1.3.1 源码
1 | |
编译:javac Person.java -> Person.class
1.3.2 编译过程
Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
由上可知:编译器其实做的事情就是“对等信息转换”。java文件中的信息其实跟class文件中的信息是一样的。
1.3.3 类文件(class文件)
官网: https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

magic(魔数):The magic item supplies the magic number identifying the file format; it has the value 0xCAFEBABE:café babe.
minor_version, major_version:0000 0034 对应十进制的52,代表JDK8中的一个版本
constant_pool_count:003f 对应十进制63代表常量池中62个常量
常量池中主要存储两方面的内容:字面量和符号引用。
1 | |
1 | |
.class字节码文件
1 | |
1.3.4 反编译验证
用javap指令验证上述猜想正确性。编译指令:javap -v -p Person.class
进行反编译之后,查看字节码信息和指令等信息。JVM相对class文件来说可以理解为是操作系统;class文件相对JVM来说可以理解是汇编语言或者机器语言。



上面分析到常量池中常量的数量是62,接下来来具体分析一下这62个常量,也就是这块包含的信息:cp_info constant_pool[constant_pool_count-1],cp其实就是一个表格的形式。
1 | |
https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4

(1)往下数一个u1,即0a->10:代表的是CONSTANT_Methodref,表示这是一个方法引用
1 | |
往下数两个u2:
第一个u2,即00 0a->10:代表的是class_index,表示该方法所属的类在常量池中的索引
第二个u2,即00 2b->43:代表的是name_and_type_index,表示该方法的名称和类型的索引。
(2)往下数u1,即08->8:表示的是CONSTANT_String,表示字符串类型
1 | |
往下数u2,即00 2c->44:代表的是string_index
(3)往下数u1,即09 ->9:表示CONSTANT_Fieldref,表示字段类型
1 | |
往下数两个u2:
第一个u2:即00 0d ->13:代表的是class_index
第二个u2:即00 2d ->45:代表的是name_and_type_index