什么是双亲委派机制?

什么是双亲委派机制?

Parent Delegation Model ,直译过来可能叫做父级委托模型更容易理解

类的加载过程

  • Java 编译器将 Java源文件编译成.class 文件
  • 再由 JVM 加载 .class 文件到内存中
  • JVM 装载完成后得到一个 Class 字节码对象
  • 拿到字节码对象之后 ,就可以实例化了
  • 类的加载过程需要使用到加载器,JVM 设计了 3 个类加载器 ,分别是 :Bootstrap 类加载器、 Extension 类加载器和 应用类加载器
  • 这些类加载器分别加载不同作用范围的 jar 包和.class 文件
    • Bootstrap ClassLoader ,主要是负责 Java 核心类库的加载 ,也就是 %{JDK_HOME}\lib 下的 rt.jar、resources.jar 等
    • Extension ClassLoader ,主要负责%{JDK_HOME}\lib\ext 目录下的 jar 包和 class 文件
    • Application ClassLoader ,主要负责当前应用里面的 classpath 下的所有 jar 包和类文件
  • 除了系统自己提供的类加载器以外,还可以通过 ClassLoader 类实现自定义加载器,去满足一些特殊场景的需求

双亲委派机制

  1. 双亲委派机制 ,也叫父级委托模型 ,就是指按照类加载器的层级关系 ,逐层进行委派
  2. 我们需要加载一个 class 文件的时候,首先会把这个 class 的查询和加载委派给父加载器去执行
  3. 如果父加载器都无法加载 ,再尝试自己来加载这个 class

意义?

  1. 保证安全性,因为这种层级关系实际上代表的是一种优先级,也就是所有的类的加 载 ,优先给 Bootstrap ClassLoader
  2. 对于核心类库中的类 ,就没办法去破坏, 比如自己写一个 java.lang.String ,最终还是会交给 Bootstrap 类加载器加载,再加上每个类加载器都有不同的作用范围 ,这就意味着自己写的 java.lang.String 没办法去覆盖核心类库中类
  3. 避免重复加载,这种层级关系的设计,可以避免类重复加载导致程序混乱的问题
  4. 即如果父加载器已经加载过了 ,那么子加载器就没必要去加载了

Tomcat的自定义类加载器

Tomcat在初始化的时候自定义了三个类加载器和其他的两个类加载器

  1. CommonLoader:加载Tomcat所需要的jar包和class文件,可以被Tomcat容器本身以及各个Webapp访问;
  2. CatalinaLoader:Tomcat容器私有的类加载器,加载路径中的class对于Webapp不可见;
  3. SharedLoader:各个Webapp共享的类加载器,加载路径中的class对于所有Webapp可见,对于Tomcat不可见;
  4. WebAppClassLoader:各个Webapp私有的类加载器,加载路径中的class只对当前Webapp可见;
  5. JasperLoader:它出现的目的就是为了被丢弃,加载路径仅仅是某个JSP文件所编译出来的那一个.class文件;

意义?

  1. 隔离同类库不同版本,因为Tomcat是可以部署多个Web应用程序的
  2. 共享同类库同版本,多个应用程序如果依赖相同类库的相同版本,应该共享同类库的同版本,避免重复的类库被加载进JVM
  3. 隔离Tomcat与应用程序的类库,Tomcat也有自己依赖的类库,不能与应用程序的类库冲突
  4. 热部署,修改jsp内容后无需重启项目将它重新加载到内存中,每个jsp对应一个唯一的类加载器,当检测到jsp内容发生更改的时候,直接卸载唯一的类加载器,然后重新创建类加载器,并加载jsp文件。
相关推荐
萧瑟余晖27 分钟前
Spring Batch核心模型与快速上手详解
java·spring·batch
缓慢更新1 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
超级架构师1 小时前
PRAXO-CORE 2.5.0:用 conformance 和显式边界构建 Go Agent 框架
开发语言·人工智能·后端·golang·ai编程·智能体框架·praxo-core
叼烟扛炮2 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
LMT流氓兔2 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
专注仿真3 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
外收内放3 小时前
Python基础语法练习题(75)
开发语言·python·学习
starzy19904 小时前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
wangbing11254 小时前
平台介绍-modbus设备调试
java
starzy19904 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala