美文网首页
类加载和双亲委派模型

类加载和双亲委派模型

作者: 王龙江_3c83 | 来源:发表于2019-03-19 09:45 被阅读0次

1. 类加载步骤

1.1 加载

将字节码数据从各种不同的数据源(class 文件、jar 文件等)中读到 JVM 中,映射为 Java 认可的数据结构(Class 对象)。

1.2 连接

  • 验证:过滤掉不合法的 class 文件。
  • 准备:为静态变量分配内存,此时不进行实例化,采用默认值。
  • 解析:

1.3 初始化

为静态变量赋予正确的初始值。

2. 类加载器类型

  • 启动类加载器

  • 扩展类加载器

  • 应用类加载器

  • 自定义类加载器

3. 双亲委派模型

3.1 原理

该过程相当于递归,递归函数算法如下:

(1)首先,检查目标类是否已在当前类加载器的命名空间中加载,是则返回 class  。
(2)若类未被加载,检查是否有父类加载器,如果有,调用父类加载器。
(3)如果没有,搜索类,如果找到则加载,如果找不到,调用自身的 findClass 方法。
注:由于首先递归调用父类,再调用自身的 findClass 方法,所以执行 findClass 方法的是,从启动类到本类,第一能加载 class 的类加载器的方法。
protected Class<?> loadClass(String name, boolean resolve)
    throws ClassNotFoundException
{
    synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        // 确定类是否被加载,如果已经被加载,则直接返回。
        Class c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    // 递归调用父类的 loadClass 方法。
                    c = parent.loadClass(name, false);
                } else {
                    // 使用启动类加载。
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }
            // 启动类未加载成功。
            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                // 使用本地类进行加载,注意,此时这个本地是从启动类本类,第一能加载 class 的类加载器的方法。
                c = findClass(name);

                // this is the defining class loader; record the stats
                sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                sun.misc.PerfCounter.getFindClasses().increment();
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

3.2 双亲模型的作用

任何一个类,都需要加载这个类的类加载器和这个类本身确定该类在虚拟机中的唯一性。那么为何不使用一个类加载器加载所有的类呢,底层类加载器分享由顶层类加载器加载的类。

3.3 自定义类加载器的方法

继承 ClassLoader 抽象类,重写 findClass() 方法。

3.4 打破双亲模型的方法

重写 loadClass 方法,在该方法中加载父类命名空间的类。

参考资料

相关文章

  • 要点提炼| 理解JVM之类加载机制

    本篇将了解类加载机制和双亲委派模型这两大知识考点: 概述 类加载全过程 类加载器&双亲委派模型 1.概述 a.JV...

  • Java 类加载

    双亲委派模型 并非强制 而是推荐 SPI 父类加载器需要子类加载器加载类 打破双亲委派模型 https://www...

  • java类加载破坏双亲委派模型

    前面java类加载器与双亲委派模型中提到Java采用个双亲委派的方式来完成类加载,但是双亲委派模型并不是一个强制的...

  • 类加载机制 双亲委派模型

    双亲委派模型 模型如下图: 双亲委派模型中除了启动类加载器之外其余都需要有自己的父类加载器 当一个类收到了类加载请...

  • ClassLoader重点梳理

    类加载器 对类加载器的学习重点要掌握以下几点: 双亲委派模型的概念 双亲委派模型的实现原理 类加载器的工作原理 如...

  • Tomcat类载入器

    大家都知道,Java的类加载机制是双亲委派模型,那么什么是双亲委派模型呢?我们这里简要的说一下,双亲委派模型...

  • 双亲委派模型

    一、什么是双亲委派模型 约定: 双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父亲加载器(但...

  • Java虚拟机

    JVM 组成部分 类加载器 执行引擎 内存区 本地方法调用 类加载器 双亲委派模型 类的加载过程采用双亲委派机制,...

  • 类加载器与双亲委派模型

    1. 双亲委派模型 1.1 什么是双亲委派模型 首先,先要知道什么是类的加载器。简单说,类加载器就是根据指定全限定...

  • JVM系列(九):Java类加载机制之双亲委派模型

    前言 双亲委派模型是Java加载类的机制.采用双亲委派模型的好处是Java类随着它的类加载器一起具备了一种带有优先...

网友评论

      本文标题:类加载和双亲委派模型

      本文链接:https://www.haomeiwen.com/subject/ozbwmqtx.html