JVM的类加载机制是指JVM在运行时将Java字节码文件加载到内存,并转换为可执行的类对象的过程。JVM的类加载机制采用了双亲委派模型(Parent-Delegation Model),它分为三个主要阶段:加载、链接和初始化。
1. 加载(Loading):类加载的第一个阶段是加载阶段,它负责查找并加载类的字节码文件。在这个阶段,类加载器根据类的全限定名,搜索并定位字节码文件。加载阶段一般包括以下几个步骤:
- 定位字节码文件:类加载器通过类的全限定名(包括包名和类名)在文件系统、网络或其他位置查找对应的字节码文件。
- 创建类的结构:一旦找到字节码文件,类加载器将其读取到内存,并根据字节码数据创建一个对应的Class对象,用于表示该类。这个Class对象包含了类的结构信息和方法描述等。
2. 链接(Linking):类加载的第二个阶段是链接阶段,它负责对类进行验证、准备和解析等处理。链接阶段一般包括以下几个步骤:
- 验证:验证阶段确保加载的字节码文件符合Java语言规范和JVM规范,并检查是否有安全性问题。例如,验证类的结构、检查类的元数据等。
- 准备:在准备阶段,为类的静态变量分配内存,并初始化为默认值。此时还未进行赋值操作。
- 解析:解析阶段将符号引用转换为直接引用。例如,将类或接口的符号引用转换为实际的内存地址。
3. 初始化(Initialization):类加载的最后一个阶段是初始化阶段,它负责执行类的初始化代码,初始化类的静态变量和静态代码块。在初始化阶段,会按照程序中定义的顺序执行类的初始化代码。类初始化过程中,会触发静态变量的赋值、静态代码块的执行以及执行类的构造方法等。
JVM的类加载机制中的双亲委派模型指的是,当一个类加载器收到加载类的请求时,它会先将请求委派给父类加载器来完成,只有在父类加载器无法加载时,才会尝试自己加载类。这种方式可以确保类的加载是有序而层次化的,避免重复加载和冲突。
通过双亲委派模型和类加载的三个阶段,JVM可以实现类的隔离性和层次化的加载机制。不同类加载器根据不同的查找规则和加载策略,从不同的地方加载类,实现了类的动态加载和隔离加载环境的需求。