JVM学习(一)-- 类加载过程与双亲委派模型

    科技2025-01-15  3

    文章目录

    类加载类加载过程类加载器双亲委派模型

    类加载

    ​ 所谓的类加载,就是指将.class字节码文件实例化成Class对象并进行相关初始化的过程。通过ClassLoader类加载器将.class类文件加载到内存中,类加载机制遵循双亲委派模型。

    类从被加载到JVM中开始,到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段。类加载过程主要包括加载,链接,初始化三个步骤

    类加载过程

    类加载过程主要分三步:

    加载(load):该阶段读取类文件产生二进制流,并转换为特定的数据结构,初步校验cafe babe魔法值,常量值,文件长度,是否存在父类等,然后创建对应类的java.lang.Class实例链接(link):该阶段包括验证,准备,解析三个步骤 验证:验证如final是否合规,类型是否正确,静态变量是否合理等准备:为静态变量分配内存,设置默认值解析:解析类与方法,确保类与类之间的相互引用正确性,完成内存结构布局 初始化(Init):该阶段执行类构造器方法,若赋值运算是通过其他类的静态方法来完成的,那么会马上解析另一个类,在虚拟机栈中执行完毕后通过返回值进行赋值 类的初始化顺序:父类静态变量 --> 父类静态代码块 --> 子类静态变量 --> 子类静态代码块 --> 父类非静态变量(父类实例成员变量)–> 父类构造函数 --> 子类非静态变量(子类实例成员变量)–>子类构造函数

    类加载器

    启动类加载器(Bootstrap ClassLoader):C++实现,在JVM启动时创建,通常由与操作系统相关的本地代码实现,是最根基的类加载器,负责装载最核心的Java类,如Object、System、String等扩展类加载器(Extension ClassLoader,JDK9之前)/平台类加载器(Platform ClassLoader,JDK9):Java实现,用来加载 Java 的扩展库,如XML,加密,压缩相关的功能类等应用程序类加载器(Application ClassLoader):Java实现,加载 Java 应用的类路径CLASSPATH下的类自定义加载器:开发人员可以通过继承 java.lang.ClassLoader 类,重写loadClass和findClass方法的方式实现自己的类加载器

    双亲委派模型

    ​ 一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

    ​ 采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。

    Processed: 0.012, SQL: 8