帮助文档首页 :https://docs.oracle.com/javase/8/
Java官网首页 :https://www.oracle.com/java/
1.2 The relation of JDK/JRE/JVM
Reference -> Developer Guides -> 定位到:https://docs.oracle.com/javase/8/docs/index.html

02 源码到类文件

2.1 源码
class Person{
private String name;
private int age;
private static String address;
private final static String hobby=”Programming”;
public void say(){
System.out.println(“person say…”);
}
public int calc(int op1,int op2){
return op1+op2;
}
}

编译: javac Person.java —-> Person.class
2.2 编译过程

Person.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器
-> 注解抽象语法树 -> 字节码生成器 -> Person.class文件
2.3 类文件(Class文件)

官网The class File Format :https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

cafe babe 0000 0034 0027 0a00 0600 1809
0019 001a 0800 1b0a 001c 001d 0700 1e07
001f 0100 046e 616d 6501 0012 4c6a 6176
612f 6c61 6e67 2f53 7472 696e 673b 0100
0361 6765 0100 0149 0100 0761 6464 7265
……

magic(魔数):
The magic item supplies the magic number identifying the class file format; it has the
value 0xCAFEBABE .

cafe babe

minor_version, major_version

0000 0034 对应10进制的52,代表JDK 8中的一个版本

constant_pool_count

0027 对应十进制27,代表常量池中27个常量

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];
}

.class字节码文件

魔数与class文件版本
常量池
访问标志
类索引、父类索引、接口索引
字段表集合
方法表集合
属性表集合

2.4 javap文件分解器

javap -c Person.class > Person.txt

03 类文件到虚拟机(类加载机制)

类加载机制
虚拟机把Class文件加载到内存
并对数据进行校验,转换解析和初始化
形成可以虚拟机直接使用的Java类型,即java.lang.Class
3.1 装载(Load)

查找和导入class文件
(1)通过一个类的全限定名获取定义此类的二进制字节流
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
(3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接
口。
在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
image.png

类的装载方式有哪些?
(1)本地系统加载
(2)网络下载.class文件
(3)从zip,jar等归档文件中加载.class文件
(4)从数据库中提取.class文件
(5)由java源文件动态编译成.class文件
(6)Class.forName()加载
(7)ClassLoader.loadClass()加载
3.2 链接(Link)

3.2.1 验证(Verify)
保证被加载类的正确性
文件格式验证
元数据验证
字节码验证
符号引用验证

3.2.2 准备(Prepare)
为类的静态变量分配内存,并将其初始化为默认值
image.png

3.2.3 解析(Resolve)
把类中的符号引用转换为直接引用
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用限定符7类符号引用进
行。
符号引用就是一组符号来描述目标,可以是任何字面量。
直接引用就是直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄。

3.3 初始化(Initialize)
对类的静态变量,静态代码块执行初始化操作image.png
image.png
3.4 类加载机制图解
使用和卸载不算是类加载过程中的阶段,只是画完整了一下
image.png