• 【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 类又是用户自己提供的因此安全性就不能得到保证了。

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

  • 相关阅读:
    pytorch常见错误
    CSS学习|css三种导入方式、基本选择器、层次选择器、结构伪类选择器、属性选择器、字体样式、文本样式
    MySQL---JDBC编程
    《CTF特训营》——古典密码学
    编程时遇到的Python语法问题汇总
    String类、String类常见的构造方法、String类的方法介绍、判断功能的方法、转换功能方法、其他方法、Object类
    STM32个人笔记-定时器
    js ---- 高级
    php万能表单系统源码 支持自定义+收费表单活动报名 适合多行业
    Visual Studio 如何把一个解决方案中已经打开的选项页在另一个解决方案中打开
  • 原文地址:https://blog.csdn.net/m0_61832361/article/details/133358517