一篇博客带你了解JVM中的双亲委派模型

简介: 一篇博客带你了解JVM中的双亲委派模型



什么是双亲委派模型

       双亲委派模型(Parent-Delegation Model)是Java类加载器(ClassLoader)机制的一种实现方式。它是Java中实现类加载的一种层次结构模型。

双亲委派模型的工作过程

       在Java中,每个类加载器实例都有一个父类加载器(除了根加载器,它没有父类加载器)。当一个类加载器需要加载一个类时,它首先会委派给它的父类加载器去尝试加载。只有当父类加载器无法加载该类时,子加载器才会尝试加载类。

       这个委派过程会一直向上追溯,直到达到根加载器。根加载器是Java虚拟机内置的类加载器,它负责加载Java核心类库(如java.lang包下的类)和其他被系统类加载器委派的类。如果根加载器无法加载类,那么子加载器会尝试使用自己的加载机制加载类。

双亲委派模型的实现

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    // 首先,检查请求的类是否已经被加载过了
    Class c = findLoadedClass(name);
    if (c == null) {
      try {
        if (parent != null) {
          c = parent.loadClass(name, false);
        } else {
          c = findBootstrapClassOrNull(name);
        }
      } catch (ClassNotFoundException e) {
      // 如果父类加载器抛出ClassNotFoundException
      // 说明父类加载器无法完成加载请求
      }
      if (c == null) {
        // 在父类加载器无法加载时
        // 再调用本身的findClass方法来进行类加载
        c = findClass(name);
      }
    }
    if (resolve) {
      resolveClass(c);
    }
    return c;
  }

       先检查请求加载的类型是否已经被加载过,若没有则调用父加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。假如父类加载器加载失败,抛出ClassNotFoundException异常的话,才调用自己的findClass()方法尝试进行加载。

双亲委派模型优势

这种双亲委派模型的设计有以下几个好处:

  1. 避免类的重复加载:当一个类加载器要加载一个类时,它会首先委派给父类加载器,如果父类加载器能够加载成功,就没有必要再由子加载器加载,这样可以避免同一个类被多个加载器重复加载的问题。
  2. 安全性:由于每个加载器只能加载自己的类和其父加载器委派的类,因此可以控制类的加载权限。核心类库由根加载器加载,防止被恶意篡改。
  3. 统一性:这种加载模型保证了类的一致性。无论由哪个加载器加载的类,得到的都是同一个类的唯一实例。

小结

       通过双亲委派模型,Java类加载器可以形成一个层次结构,提供了更好的类加载管理和隔离机制。

相关文章
|
4月前
|
安全 Java
对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解
对 JVM 的类加载机制以及寻找字节码文件的“双亲委派模型”的理解
34 0
|
9天前
|
安全 Java 应用服务中间件
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
什么是类加载器,类加载器有哪些;什么是双亲委派模型,JVM为什么采用双亲委派机制,打破双亲委派机制;类装载的执行过程
JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程
|
4月前
|
存储 算法 Oracle
深入理解 JVM(重点:双亲委派模型 + 垃圾回收算法)
深入理解 JVM(重点:双亲委派模型 + 垃圾回收算法)
|
4月前
|
存储 Java C++
JVM内存模型和结构详解(五大模型图解)
JVM内存模型和结构详解(五大模型图解)
|
4月前
|
存储 安全 Java
JVM类加载(类加载过程、双亲委派模型)
JVM类加载(类加载过程、双亲委派模型)
|
前端开发 Java 应用服务中间件
【Java虚拟机】JVM类加载机制和双亲委派模型
【Java虚拟机】JVM类加载机制和双亲委派模型
【Java虚拟机】JVM类加载机制和双亲委派模型
|
存储 安全 Java
JVM学习.04. Java内存模型与线程模型
该篇内容主要介绍JVM如何实现多线程,多线程间由于共享和竞争数据而导致的一系列问题以及解决方案。
254 1
JVM学习.04. Java内存模型与线程模型
|
存储 Java 应用服务中间件
jvm内存模型
jvm内存模型
117 0
|
消息中间件 算法 Java
jvm性能调优 - 04JVM分代模型
jvm性能调优 - 04JVM分代模型
81 0
|
Java 调度 C++
jvm oop-klass对象模型
因此,当讲到jvm的对象模型的实现时候,可能会很自然地想到,只要java对象底层对应一个C++对象,问题就解决了。因为klassKlass的指针始终是指向自己的。其中_mark,_metadata一起合成为了对象头,里面包含了锁状态标志、线程持有的锁等标志,_metadata包含了两个指针,指向klass,klass包含了实例对象的元数据。上来就是三张图,c++写的,虽然咱们不能完全看明白,但是从定义属性这些大致也有了个了解,这个模型是由oop类和klass组合起来的,然后这两个大类下面又有很多的子类。
103 0