【JVM类加载】类的加载,连接与初始化(【深入解析JVM】类加载机制:加载、连接与初始化全过程详解)
原创
一、概述
Java虚拟机(JVM)是Java程序运行的基础,负责管理和执行Java程序。类加载是JVM的核心功能之一,它负责将编译后的Java类文件(.class)加载到JVM中,并为程序提供运行时所需的类信息。类加载过程核心包括三个阶段:加载、连接和初始化。本文将详细介绍这三个阶段的全过程。
二、类的加载
类加载的第一阶段是加载,它负责将.class文件读取到JVM,并为之创建一个对应的java.lang.Class对象。加载阶段核心完成以下三个步骤:
1. 类的加载时机
类的加载时机核心有三种:
- 主动加载:当程序中使用new、getDeclaredConstructor()、newInstance()等方法创建对象时,会触发类的主动加载。
- 被动加载:当程序中使用类名、类字段、类方法等时,会触发类的被动加载。
- 自定义加载:通过自定义类加载器,可以控制类的加载时机。
2. 类加载器
类加载器负责将.class文件加载到JVM中。Java默认提供了三种类加载器:
- Bootstrap ClassLoader:负责加载JVM核心类库(rt.jar)。
- Extension ClassLoader:负责加载扩展类库(jre/lib/ext目录下的类库)。
- System ClassLoader:负责加载程序类路径(classpath)下的类库。
此外,用户还可以自定义类加载器。
3. 类加载过程
类加载过程如下:
- 检查类是否已经被加载:首先,类加载器会检查该类是否已经被加载过,如果已加载,则直接返回对应的Class对象。
- 加载类文件:类加载器会读取.class文件的字节码,并为之创建一个对应的Class对象。
- 生成Class对象:类加载器将Class对象存储在JVM的方法区中,供后续使用。
三、类的连接
类加载的第二阶段是连接,它负责将Class对象中的字节码成为JVM可执行的指令。连接阶段核心分为两个部分:验证和准备。
1. 验证
验证阶段核心是对加载的类进行语法、语义和保险性检查,确保被加载的类符合JVM规范。验证过程核心包括以下步骤:
- 文件格式验证:检查.class文件的格式是否正确。
- 元数据验证:检查类、接口、字段、方法的元数据是否符合JVM规范。
- 字节码验证:检查字节码是否合法,如类型检查、操作数栈检查等。
2. 准备
准备阶段核心是为类中的静态字段分配内存,并设置默认初始值。准备阶段不涉及代码执行,仅设置静态字段的初始值。
四、类的初始化
类加载的第三阶段是初始化,它负责执行类构造器
1. 初始化时机
类的初始化时机核心有以下几种:
- 主动初始化:当使用new、getDeclaredConstructor()、newInstance()等方法创建对象时,会触发类的主动初始化。
- 被动初始化:当使用类名、类字段、类方法等时,会触发类的被动初始化。
- 自定义初始化:通过自定义类加载器,可以控制类的初始化时机。
2. 初始化过程
类的初始化过程如下:
- 检查是否已经初始化:首先,类加载器会检查该类是否已经初始化,如果已初始化,则直接返回。
- 执行
()方法:类加载器会执行类构造器 ()方法,为类中的静态字段设置正确的初始值。 - 创建对象:完成初始化后,类加载器会创建一个对象实例。
3. ()方法
public class MyClass {
static {
System.out.println("静态初始化块");
}
static int myValue = 10;
public static void main(String[] args) {
System.out.println("myValue: " + myValue);
}
}
在这个示例中,当JVM加载MyClass类时,会执行
五、总结
类加载是JVM的核心功能之一,它负责将编译后的Java类文件加载到JVM中,并为程序提供运行时所需的类信息。类加载过程核心包括三个阶段:加载、连接和初始化。通过了解这三个阶段,我们可以更好地领会JVM的工作原理,优化程序性能。
以上是一篇涉及JVM类加载的HTML文章,内容涵盖了类加载的三个阶段:加载、连接和初始化。文章中使用了`