Java虚拟机加载Class文件的过程是一个复杂的过程,包括类的加载、连接和初始化三个阶段。以下是JVM加载Class文件的原理机制:
-
加载(Loading):
- 类加载器的加载阶段: 类加载器负责将Class文件加载到内存中。Java虚拟机有三个内建的类加载器:
- 启动类加载器(Bootstrap Class Loader): 负责加载Java核心类库,通常由C++实现。
- 扩展类加载器(Extension Class Loader): 负责加载Java的扩展类库,一般对应
jre/lib/ext
目录中的jar包。 - 应用程序类加载器(Application Class Loader): 负责加载应用程序的类路径上的类。是最常用的类加载器。
- 双亲委派模型: 类加载器采用双亲委派模型,即在加载类的时候,先将加载请求委派给父类加载器,只有在父类加载器无法加载时才由当前类加载器自己加载。
- 类加载器的加载阶段: 类加载器负责将Class文件加载到内存中。Java虚拟机有三个内建的类加载器:
-
连接(Linking):
- 验证(Verification): 确保Class文件的字节流符合JVM规范,防止恶意代码。
- 准备(Preparation): 为类的静态变量分配内存,并设置默认初始值。
- 解析(Resolution): 将类、接口、字段、方法等符号引用解析为直接引用。解析阶段可能在类加载阶段之后进行,也可能在初始化阶段之后进行。
-
初始化(Initialization):
- 执行类构造器
: 对类的静态变量进行赋值和静态代码块的执行,是由编译器自动收集类中的所有类变量的赋值动作和静态代码块中的语句合并产生的。
- 执行类构造器
加载Class文件的整体流程是:首先由类加载器加载字节码文件,然后进行验证、准备和解析等链接过程,最后进行初始化。在初始化阶段,会执行类的初始化方法,即类中的静态块和类构造器(
需要注意的是,类的加载和初始化是懒加载的,即只有在首次对类进行主动使用(如创建对象、调用静态方法)时才进行加载和初始化。
Was this helpful?
0 / 0