Java 类加载过程
- 类的生命周期
- 类的加载过程
- 加载
- 验证
- 准备
- 解析
- 初始化
类的生命周期
类的生命周期:
加载(Loading)— 验证(Verification)— 准备(Preparation)— 解析(Resolution)— 初始化(Initialization)— 使用(Using)— 卸载(Unloading)。其中,验证、准备和解析这三个阶段可以统称为连接(Linking)。
类的加载过程
系统加载 Class 类型的文件主要三步:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。
加载
加载(Loading)阶段是整个“类加载”(Class Loading)过程中的一个阶段,它和类加载 Class Loading 是不同的,一个是加载 Loading 另一个是类加载 Class Loading,所以不要把二者搞混了。
在加载 Loading 阶段,Java 虚拟机需要完成以下 3 件事:
1、通过一个类的全限定名来获取定义此类的二进制字节流;
2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
3、在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
验证
验证是连接阶段的第一步,这一阶段的目的是确保 Class 文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。 验证选项:
1、文件格式验证
2、字节码验证
3、符号引用验证…
准备
准备(Preparation):为类的静态变量分配内存,并设置默认初始值。准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。比如此时有这样一行代码:
public static int value = 100;
它是初始化 value 的 int 值为 0,而非 100
解析
解析(Resolution):将类中的符号引用转换为直接引用,比如将类中的方法名转换为实际的内存地址。
解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程,也就是得到类或者字段、方法在内存中的指针或者偏移量。
初始化
初始化阶段是执行类的初始化代码,包括静态变量赋值和静态代码块的执行。是类加载的最后一步,这一步 JVM 才开始真正执行类中定义的 Java 程序代码(字节码)。