共计 1671 个字符,预计需要花费 5 分钟才能阅读完成。
在 Java 中,类加载的流程有一个专门的机制叫做“类加载机制”。类加载机制是指一个类在 Java 虚拟机(JVM)中的执行流程,它也是 Java 程序可能失常执行的关键所在,那它的具体执行流程是啥?接下来咱们一起来看。
流程概述
在 JVM 中,类加载会经验以下 5 个阶段:
- 加载阶段(Loading)
- 验证阶段(Verification)
- 筹备阶段(Preparation)
- 解析阶段(Resolution)
- 初始化阶段(Initialization)
其中:验证阶段、筹备阶段和解析阶段合起来又称为连贯阶段,所以以上 5 个阶段又能够划分为 3 大类:
- 加载阶段(Loading)
连贯阶段(Linking)
- 验证阶段(Verification)
- 筹备阶段(Preparation)
- 解析阶段(Resolution)
- 初始化阶段(Initialization)
具体分类如下图所示:
这 3 大类、5 个流程的具体执行细节是这样的。
1. 加载阶段
简略来说,加载阶段就是将类文件加载到内存中的过程。在加载阶段,JVM 须要实现以下 3 件事:
- 通过一个类的全限定名来获取定义此类的二进制字节流;
- 将这个字节流所代表的动态存储构造转化为办法区的运行时数据结构;
在内存中生成一个代表这个类的 java.lang.Class 对象,作为办法区这个类的各种数据的拜访入口。
2. 连贯阶段
连贯阶段又分为:验证阶段(Verification)、筹备阶段(Preparation)和解析阶段(Resolution),具体执行的细节如下。
2.1 验证阶段
验证阶段也叫做校验阶段,它次要是用来验证加载到内存中的类是否是平安合规的文件,验证的次要动作大略有以下几个(当然,以下细节如果切实记不住也没关系):
- 文件格式校验包含常量池中的常量类型、Class 文件的各个局部是否被删除或被追加了其余信息等;
- 元数据校验包含父类正确性校验(查看父类是否有被 final 润饰)、抽象类校验等;
- 字节码校验,此步骤最为要害和简单,次要用于校验程序中的语义是否非法且合乎逻辑;
符号援用校验,对类本身以外比方常量池中的各种符号援用的信息进行匹配性校验。
### 2.2 筹备阶段
筹备阶段就开始给类中的动态变量设置默认值了,留神这里不是给动态变量设置初始值,而是设置默认值,二者还是有很大区别的。
举个例子,比方代码中写的内容是:public static int number = 10;
那么此时是给 number 变量设置的 int 值是默认值 0,而非初始值 10。
2.3 解析阶段
解析阶段就是将常量池中的符号援用更换成间接援用了 ,所谓的符号援用是指以一组符号来形容所援用的指标,符号能够是任何模式的字面量,只有应用时能无歧义地定位到指标即可;而间接援用是能够间接指向指标的指针、绝对偏移量或者是一个能间接定位到指标的句柄。
符号援用和间接援用有一个重要的区别:应用符号援用时被援用的指标不肯定曾经加载到内存中;而应用间接援用时,援用的指标必然曾经存在虚拟机的内存中了。
3. 初始化阶段
初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。到这一步骤之后,类的加载过程就算正式实现了,此时会给动态变量设置初始值,并执行动态代码块的内容。
总结
类加载流程总共分为 3 大类,5 个次要流程:
- 加载阶段(Loading):将类文件加载到内存。
连贯阶段(Linking)
- 验证阶段(Verification):类文件安全性效验。
- 筹备阶段(Preparation):给动态变量设置默认值。
- 解析阶段(Resolution):将符号援用转换为间接援用。
- 初始化阶段(Initialization):执行动态代码块和给动态变量设置初始值。
本文已收录到 Gitee 开源仓库《Java 面试指南》,其中蕴含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、音讯队列等模块。Java 面试有它就够了,点击查看详情:interview: 400+ 道 Java 常见面试题和解析,继续更新中 ……