模拟面试回答第十四问:双亲委派模型

简介(总)

对于双亲委派模型,我从几个方面来介绍,类加载,类加载器,双亲委派模型,好处,打破双亲委派以及JDK8到9模型产生的变化六个方面。

类加载(分1)

首先是类加载,当我们new一个对象实例时或者执行某类的main方法时都会触发类加载,类加载的作用就是为了让JVM认识这个类,知道它的各种信息,比如字段,方法,继承了哪些类,方法内引用了哪些对象,实例需要分配多大内存等等,类加载有五个阶段,加载、验证、准备、解析、初始化。不过本题我们关注的不是加载过程中,而是加载之前,这个类加载请求是由谁呈递的,那答案是类加载器。

类加载器(分2)

JVM设计了三层类加载器负责加载不同的类,每层类加载器都有自己负责的范围,分别是启动类加载器,扩展类加载器,应用类加载器。启动类加载器是最顶层的,负责加载JAVA_HOME/lib目录中的Jar包;扩展类加载器负责加载JAVA_HOME/lib/ext目录中的Jar包;应用类加载器负责加载当前项目路径下的类和引入的三方依赖。

双亲委派模型(分3)

那双亲委派模型就是指这些类加载器的加载优先级,子类加载器收到类请求后,优先委派给父类加载器,如果父类加载器无法加载,自己再加载,这就是双亲委派模型。

好处 (分4)

双亲委派模型有两点主要好处:

  1. 保证核心类库的安全,比如我自己写了一个java.lang.String.class放在项目路径下,属于应用类加载器负责的范围,当触发String的类加载时,应用类加载器接受到请求后不会自己加载,而是优先交给扩展类加载器,扩展类再交给启动类加载器,启动类加载器检索类库,找到了核心类java.lang.String.class,执行类加载。这证明了核心类不会被自己写的同名类替代,保证安全。
  2. 避免重复加载,当启动类加载器加载了String类之后,扩展类和应用类加载器就不会再加载了,加载请求结束了。

打破(分5)

有没有特殊场景需要打破双亲委派模型呢?有的,兄弟,有的,那就是Tomcat,这是一个Web服务器,Tomcat运行多个应用,不同应用可能使用不同的依赖版本,这是Tomcat的需求。而双亲委派模型会使这些应用加载同一个版本,所以Tomcat自己实现了WebAppClassLoader类,重写了loadClass()方法,重写逻辑变成先自己加载,找不到再委派给父类。Tomcat运行应用时为每个应用创建WebAppClassLoader实例,实现了应用隔离。

这样做的好处除了隔离性之外,还有热部署和安全性。重新部署应用时将之前WebAppClassLoader删掉,重新创建一个,不会被缓存干扰;不同的应用不能访问各自的类,因为加载器实例不同。

迭代变化(分6)

JDK8是个分水岭,类加载器和双亲委派模型都有变化,类加载器将扩展类加载器变成了平台类加载器,并且加载器的加载模式变了,不再是以前的匹配路径加载Jar包,而是加载模块,启动类加载器加载java.base等核心模块,平台累加载器加载java.sal,java.xml等非核心但常用的模块,应用类加载器加载项目中自己写的类和三方依赖,三方依赖可能是模块,也可能是原始Jar包。那模块到底是什么呢?其实就是加入了一些额外信息的Jar包,主要包括依赖信息。

这个依赖信息导致双亲委派模型也有变化,委派逻辑不再是严格的向上委派,而是根据模块间的依赖关系进行委派,比如java.xml模块依赖应用类加载器负责的A模块,那加载java.xml模块的类之前先要委托应用类加载器加载A模块,之后再加载java.xml的类。

这样做的好处就是更加灵活。

相关推荐
EntyIU17 分钟前
JVM内存与GC笔记
java·jvm·笔记
swipe22 分钟前
DeepAgents 实战:用多 Agent 架构搭一个深度调研助手
javascript·面试·llm
雪宫街道1 小时前
synchronized 锁的范围:对象锁、类锁与代码块锁
java·jvm·后端·面试
凯瑟琳.奥古斯特1 小时前
数据库原理选择题精选
数据库·python·职场和发展
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第84题】【Mysql篇】第14题:为什么用 InnoDB 存储引擎的表建议用整型的自增主键?
java·开发语言·数据库·mysql·面试
小江的记录本3 小时前
【JVM虚拟机】JVM调优:常用JVM参数、调优核心指标、OOM排查、GC日志分析、Arthas工具使用(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·后端·python·spring·面试
秦明月134 小时前
水冷板装配安全回路设计实战解析
经验分享·其他·职场和发展·创业创新·学习方法
swipe5 小时前
DeepAgents 多 Agent 深度调研助手工程实战:从 createDeepAgent 到可控调研工作流
javascript·面试·langchain
moMo6 小时前
JavaScript 变量提升,执行上下文里的各种门道
javascript·面试
UTF_86 小时前
一次NSMutableAttributedString误用的思考
ios·面试·github