• 【JVM】双亲委派模型


    1. 什么是双亲委派模型

    提到 类加载 机制,不得不提的一个概念就是“双亲委派模型”。

    双亲委派模型指的就是 JVM 中的类加载器如何根据类的全限定名找到 .class 文件的过程

    类加载器:
    JVM 里面专门提供的对象, 负责类加载

    .class 文件可能存放的位置有很多,有的放 jdk 目录里,有的放项目目录里,还有的放在其他位置。
    所以 JVM 提供了多种类加载器,每个类加载器负责一个片区。

    站在 Java 虚拟机的角度来看,只存在两种不同的类加载器:

    • 一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用 C++ 语言实现,是虚拟机自身的一部分;
    • 另外一种就是其他所有的类加载器,这些类加载器都由Java语言实现,独立存在于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。

    站在 Java 开发人员的角度来看,类加载器就应当划分得更细致一 些。自 JDK 1.2 以来,Java 一直保持着三层类加载器、双亲委派的类加载架构器。

    • 如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成。
    • 每一个层次的类加载器都是如此,因此所有的加载请求最 终都应该传送到最顶层的启动类加载器中
    • 只有当父加载器反馈自己无 法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。

    在这里插入图片描述

    • 启动类加载器:加载 JDK 中 lib 目录中 Java 的核心类(标准类)库,即$JAVA_HOME/lib目录。
    • 扩展类加载器。加载 lib/ext 目录下的类(扩展类)。
    • 应用程序类加载器:加载我们写的应用程序。
    • 自定义类加载器:根据自己的需求定制类加载器。

    举个栗子: 加载 java.lang.String (没有考虑有自定义的类加载器)

    1. 程序启动,先进入 ApplicationClassLoader 类加载器。
    2. ApplicationClassLoader 类加载器会检查父类加载器是否加载过,没有则调用父类加载器 ExtensionClassLoader 。
    3. ExtensionClassLoader 类加载器检查它的类加载器是否加载过,没有则调用父类加载器 BootStrap ClassLoader。
    4. BootStrap ClassLoader 发现没有父类加载器,所以扫描自己负责的目录。
    5. java.lang.String 这个类在标准库中能直接找到,所以由 BootStrap ClassLoader 负责后续加载过程,查找环节就结束了 (要是没找到,就让子类加载器进行加载)。

    2. 双亲委派模型的优点

    1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那么在 B 类进行加载时就不需要在重复加载 C 类了。

    2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户自己提供的因此安全性就不能得到保证了。

    注意:
    自己定义的类加载器可以遵守双亲委派模型,也可以不遵守,主要是看实际需求。

  • 相关阅读:
    【力扣】27. 移除元素
    Openai CLIP模型论文精读及详解
    Docker的私有仓库部署——Harbor
    iOS17.2正式版什么时候发布? 13大新功能细节抢先看
    【博客539】使用openssl手动为k8s集群签发证书
    【C++】构造函数和析构函数第一部分(构造函数和析构函数的作用)--- 2023.9.25
    东盟与中日韩(10+3)中小企业人工智能产业论坛
    3分钟从零解读Transformer的Encoder
    测试行业3年经验,从大厂裸辞后,面试阿里、字节全都一面挂,被面试官说我的水平还不如应届生
    (附源码)ssm学生选课系统 毕业设计 170920
  • 原文地址:https://blog.csdn.net/m0_61832361/article/details/133358517