Java 中类加载总共分为以下 5 个步骤。
1.加载
加载(Loading):查找并加载类的二进制数据。这个过程可以通过类的全限定名来完成,也可以通过其他方式完成,比如使用 ClassLoader.loadClass() 方法。
在加载 Loading 阶段,Java 虚拟机需要完成以下 3 件事:
- 通过一个类的全限定名来获取定义此类的二进制字节流;
- 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;
- 在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。
2.验证
验证(Verification):验证加载的类是否符合 Java 虚拟机规范,比如是否有正确的文件格式、是否有正确的访问权限等。
验证是连接阶段的第一步,这一阶段的目的是确保 Class 文件的字节 流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信 息被当作代码运行后不会危害虚拟机自身的安全。
验证选项:
- 文件格式验证
- 字节码验证
- 符号引用验证...
3.准备
准备(Preparation):为类的静态变量分配内存,并设置默认初始值。
准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。
比如此时有这样一行代码:
public static int value = 123;
它是初始化 value 的 int 值为 0,而非 123。
4.解析
解析(Resolution):将类中的符号引用转换为直接引用,比如将类中的方法名转换为实际的内存地址。
解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。
5.初始化
初始化(Initialization):执行类的初始化代码,包括静态变量赋值和静态代码块的执行。
小结
以上 5 个步骤总共分为 3 个大步骤:
- 加载: 查找并加载类的二进制数据。
- 连接: 将 Java 类的二进制数据合并到 JVM 运行状态之中。
- 验证:验证加载的类是否符合 Java 虚拟机规范。
- 准备:为类的静态变量分配内存,并设置默认初始值。
- 解析:将类中的符号引用转换为直接引用。
- 初始化: 执行类的初始化代码,包括静态变量赋值和静态代码块的执行。
特殊说明
以上内容来自我的《Java 面试突击训练营》,这门课程是有着十几年工作经验(前 360 开发工程师),10 年面试官经验的我,花费 4 年时间打磨完成的一门视频面试课。学完训练营的课程之后,基本可以应对目前市面上绝大部分公司的面试了,并且课程配备了 9 大就业服务,帮助上千人找到 Java 工作,其中上百人拿到大厂 Offer,学员最高薪资 70W 年薪,面试课目录和 9 大服务如下:
加我微信咨询:vipStone【备注:训练营】