双亲委派模型是 Java 类加载器的一种工作模式,通过这种工作模式,Java 虚拟机将类文件加载到内存中,这样就保证了 Java 程序能够正常的运行起来。那么双亲委派模型究竟说的是啥呢?接下来我们一起来看。

1.类加载器

双亲委派模型针对的是 Java 虚拟机中三个类加载器的,这三个类加载器分别是:

  1. 启动类加载器(Bootstrap ClassLoader)

  1. 扩展类加载器(Extension ClassLoader)

  1. 应用程序类加载器(Application ClassLoader)

如下图所示:

这 3 个类加载器的作用如下。

1.1 启动类加载器

启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,它是用来加载 <JAVA_HOME>\jre\lib\rt.jar 和 resources.jar 等 jar 包的,如下图所示:

接下来我们写个代码测试一下 rt 类加载器的打印:

publicclassClassLoaderExample {publicstaticvoidmain(String[] args) {// rt 类下的 ClassLoader 打印System.out.println("rt classloader:" + String.class.getClassLoader());}
}
复制代码

以上程序的执行结果如下图所示:

问题来了,为什么打印的不是“Bootstrap ClassLoader”而是 null 呢?

这是因为启动类加载器(Bootstrap ClassLoader)是由 C++ 实现的,而这个 C++ 实现的类加载器在 Java 中是没有与之对应的类的,所以拿到的结果是 null。

1.2 扩展类加载器

扩展类加载器是用来加载 <JAVA_HOME>\jre\lib\ext 目录下 jar 包的,如下图所示:

接下来我们使用代码来演示一下 ext 类加载器,示例代码如下:

publicclassClassLoaderExample {publicstaticvoidmain(String[] args) {// ext 类下 classloader 打印System.out.println("ext classloader:" +sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());}
}
复制代码

以上程序的执行结果如下图所示:

1.3 应用程序类加载器

应用程序类加载器是用来加载 classpath 也就是用户的所有类的,接下来我们写代码测试一下应用程序类加载器的打印,实现代码如下:

publicclassClassLoaderExample {publicstaticvoidmain(String[] args) {System.out.println("application classloader:" +ClassLoaderExample.class.getClassLoader());}
}
复制代码

以上程序的执行结果如下图所示:

2.双亲委派模型

双亲委派模型的执行流程是这样的:1、当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程;

2、在扩展加载器缓存中查找相应的类,如果能找到就返回对象,如果找不到就继续下面流程;

3、在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程;

4、在扩展加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就继续下面流程;

5、在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。

加载流程如下图所示:

一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。

3.优缺点分析

3.1 优点

双亲委派模型的优点有两个:1、安全。2、避免重复加载。

3.1.1 安全

在安全方面的表现时,当使用双亲委派模型时,用户就不能伪造一些不安全的系统类了,比如 jre 里面已经提供了 String 类在启动类加载时加载,那么用户自定义再自定义一个不安全的 String 类时,按照双亲委派模型就不会再加载用户定义的那个不安全的 String 类了,这样就可以避免非安全问题的发生了。

3.1.2 避免重复加载

使用双亲委派模型也可以避免一个类被重复加载,当一个类被加载之后,因为使用的双亲委派模型,这样不会出现多个类加载器都将同一个类重复加载的情况了。

3.2 缺点

双亲委派模型的典型问题是加载 SPI 实现类的场景,比如 JNDI(Java Naming and Directory Interface,Java 命名与目录接口)服务,它的代码由启动类加载器去加载(在 JDK 1.3 时放进 rt.jar),但 JNDI 的目的就是对资源进行集中管理和查找,它需要调用独立厂商实现部部署在应用程序的 classpath 下的 JNDI 接口提供者(SPI, Service Provider Interface)的代码,但启动类加载器不可能“认识”之些代码,这就双亲委派模型的问题,JDBC 也是同样的问题。

总结

双亲委派模型是和 Java 中多个类加载器(启动类加载器、扩展加载器、应用程序类加载器)的运行规则,通过这个(双亲委派模型)规则可以避免类的非安全问题和类被重复加载的问题,但它也遇到了一些问题,比如 JNDI 和 JDBC 不能通过这个规则进行加载,它需要通过打破双亲委派的模型的方式来加载。

作者:Java中文社群

链接:https://juejin.cn/post/7195577258907729975

面试官:什么是双亲委派模型?相关推荐

  1. java 委托_面试官:java双亲委派机制及作用

    什么是双亲委派机制 当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类. 类加载器的类别 Bootst ...

  2. 面试官:什么是双亲委派模型?如何打破它?

    本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) 参加过校招面试的同学,应该对这个问题不陌生.一般提问 JVM 知识点的时候,就会 ...

  3. 面试官:谈谈你对双亲委派模型的理解?

    双亲委派模型 双亲只是"parent"的直译,全称parent-delegation model(虽然我还是无法理解parent为什么翻译成双亲??) 作用: 对于任何一个类,都需 ...

  4. 如何破坏双亲委派模型

    起源来自于网易面试官的一个问题,一个类的静态块是否可能被执行两次.众所周知类加载的初始化阶段会自动收集类中所有类变量的赋值动作与静态语句块中的语句生成一个()方法,这个方法只会被执行一次.因此通常的理 ...

  5. 【04-JVM面试专题-什么是双亲委派机制(父类委托机制)?如何打破双亲委派机制?双亲委派机制的优缺点?什么是沙箱安全机制呢?】

    什么是双亲委派机制?如何打破双亲委派机制? JVM的双亲委派机制知道吗?怎么打破它呢?你看看自己掌握的怎么样呢? 什么是双亲委派机制?(父类委托机制) 检查某个类是否已经加载 自底向上,从Custom ...

  6. 为什么要破坏JVM的双亲委派模型

    本文来说下为什么要破坏JVM的双亲委派模型 文章目录 概述 双亲委派模型 破坏双亲委派模型 不使用Java SPI 使用Java SPI 自定义类加载器 为什么要自定义类加载器 ClassLoader ...

  7. 【Flink】双亲委派模型与Flink的类加载策略 child-first parent-first

    1.概述 转载:双亲委派模型与Flink的类加载策略 child-first parent-first 我记得我好像以前写过类似的文章,但是找不到了,转载一篇补充一下.. 2.类加载 我们知道,在JV ...

  8. 双亲委派模型,类的加载机制,搞定大厂高频面试题

    看过这篇文章,大厂面试你「双亲委派模型」,硬气的说一句,你怕啥? 读该文章姿势 打开手头的 IDE,按照文章内容及思路进行代码跟踪与思考 手头没有 IDE,先收藏,回头看 (万一哪次面试问了呢) 需要 ...

  9. 分析JVM双亲委派模型的类加载源码 自定义类加载器

    双亲委派模型下,在父类加载器无法加载的情况下再由当前类加载器去加载.具体的实现逻辑在java.util.ClassLoader抽象类的loadClass方法中.在该方法中,先检查是否已经加载过,如果没 ...

最新文章

  1. 盯住未来!揭秘英特尔的AI芯片生意
  2. 算法学习:常用排序方法
  3. 五一假期将至,机房维护工作要做好
  4. echarts在.Net中使用实例(一) 简单的Demo
  5. SAP Spartacus避免不能向下兼容的breaking changes
  6. 使用TorchElastic训练DeepSpeech
  7. jmeter性能分析_使用JMeter和Yourkit进行REST / HTTP服务的性能分析
  8. openstack网络指南_性格内向的战术网络指南
  9. ES | CentOS下基于ElasticSearch的head插件安装
  10. 数据预处理第5讲:特征缩放
  11. adobe pdf for linux,Linux PDF阅读软件Adobe Reader 9.5.5发布( for linux)
  12. Cortex-M0+电源管理
  13. 最长等差数列 leetcode java_51nod1055 最长等差数列
  14. 神奇的Navigator对象
  15. Linux系统/etc/resolv.conf文件为只读模式,且无法更改权限
  16. 中国互联网生态报告发布
  17. Happy Father's Day 告诉父亲你爱他
  18. 国际漫游攻略之2016
  19. Linux安装pyhive
  20. pdfminer总是无故报错,可能是其他pdf第三方库影响

热门文章

  1. 苹果税降低了一半,这对于小企业是一个机会吗?
  2. 番茄工作法:战胜拖延症的良药
  3. mysql mac 图形化界面_mac安装mysql图形化工具?
  4. 2018年湘潭邀请赛小节题解—暨鶸第一次参赛
  5. python sklearn 安装注意点
  6. 全球及中国工业结晶器行业发展现状与投资规划分析报告2022-2028年
  7. 扇区时间 lotus-storage-miner sectors status
  8. Golang状态设计模式(二十)
  9. leetcode- 实现二叉树先序,中序和后序遍历
  10. jq中的append方法