• Java : 类加载和双亲委派模型


    类加载机制

    类加载机制:指的是虚拟机将 描述类的数据 从 .class 文件中加载到内存,并进行校验,解析和初始化,形成 Java 虚拟机能够直接使用的数据类型的机制

    类加载包括三个步骤: 加载, 链接, 初始化

    加载

    在这个步骤中,类加载器会寻找 .class 文件,打开并读取文件数据到内存中,并转换成方法区运行时数据,并在堆中创建一个 Class 对象 作为方法区数据访问的入口

    链接

    链接也包含三个步骤: 验证, 准备,解析

    1. 验证
      会检验这个 .class 文件格式是否符合 JVM 的规范要求, 具体点, 会检验这个 .class 文件加载进内存中的字节流是否符合 JVM 规范
    2. 准备
      会进行类变量分配空间, 并暂时赋为 0 值 或者 null 值
    3. 解析
      进行字符串常量的初始化, 将符号引用更新为直接引用
      在编译过程中, 编译器会先将字符串常量标记出来, 并使用特殊符号作为占位符, 等到类加载中链接的解析阶段的时候, 就将真正的引用替换掉原来的占位符

    初始化

    这个过程会完成静态变量 (类对象) 的真正初始化(代码中赋为何值, 此时就赋为何值), 执行静态代码块。在初始化一个类的时候,如果发现该类的父类还没初始化,会优先初始化父类。

    双亲委派模型

    在类加载中的 加载阶段中, 类加载器是怎样寻找 .class 文件的?在 JVM 中是通过双亲委派模型来完成该任务。
    在 JVM中,会由类加载器来完成这个任务,包括三个类加载器:BootStrapClassLoader,ExtensionClassLoader 和 ApplicationClassLoader

    • BootStrapClassLoader 用于加载标准库中的类
    • ExtensionClassLoader 用于加载拓展类
    • ApplicationClassLoader 用于加载用户自定义的类

    JVM 在这三个类中定义了父子关系,从上到下,上面是下面的父亲,例如,BootStrapClassLoader 是ExtensionClassLoader 的父亲,ExtensionClassLoader 是 ApplicationClassLoader 的父亲。

    定义完这个关系之后,遵循一个规则:当子类加载类的时候,会先交给自己的父亲,父亲再交给它的父亲,如果没有父亲,那么就由该类先扫描自己的目录,如果能完成加载,那就完成任务,否则再交给自己的子类扫描,是一个从下到上,再从上往下扫描的过程

    例如:对于拓展库(在ExtensionClassLoader 目录中)中的类, JVM 会先调用 ApplicationClassLoader 这个加载器,这个加载器并不会立刻扫描自己的目录,而是交给自己的父亲 ExtensionClassLoader,它也不会立刻扫描自己,而是再交给自己的父类 BootStrapClassLoader,这个类加载器没有父亲了,所以开始扫描自己,但是由于在拓展库中,所以自然扫描不到,再交返给自己的孩子 ExtensionClassLoader 加载,显然至此任务完成。如果所有类加载器都无法加载某个类,就会抛出 ClassNotFount 异常

    看到这,我们可以假设一下,如果刚开始 ApplicationClassLoader 直接扫描自己目录中的类,会出现啥情况?

    假设我们自己定义了一个和标准库同名的类:String,这时如果 ApplicationClassLoader 立刻加载这个类,就会导致 BootStrapClassLoader 中要加载的 String 类被覆盖因此 JVM 要优先保证高优先度的类能够被正确加载
    除此之外,双亲委派模型还能防止同个类被多次加载。

  • 相关阅读:
    【无人机】基于拓展卡尔曼滤波时序四旋翼无人机状态跟踪附matlab代码
    项目管理逻辑:项目经理如何掌控项目生命周期, 才能避免身心俱疲?
    C/C++|基于回调函数实现异步操作
    npm命令--安装依赖包--用法/详解
    MongoDB聚合运算符:$dateAdd
    【Electron将HTML项目打包成桌面应用exe文件】
    spring cloud 基本术语
    【牛客网——算法刷题】开篇介绍
    react-router-dom V6 路由
    MySQL的MVCC机制
  • 原文地址:https://blog.csdn.net/weixin_63519461/article/details/127795702