当前位置: 首页 > news >正文

什么是双亲委派机制?

什么是双亲委派机制?

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文件。
http://www.lryc.cn/news/114263.html

相关文章:

  • Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支
  • ChatGPT: 人机交互的未来
  • Linux 常用操作命令
  • 24届近5年重庆邮电大学自动化考研院校分析
  • 如何对oracle和mysql进行 分区分表
  • Windows下安装Sqoop
  • Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题
  • Java技术整理(3)—— 多线程并发篇
  • 2023热门跨境电商平台哪个入驻条件适合新手?
  • 【MFC】05.MFC第一大机制:程序启动机制-笔记
  • 小程序动画 animation 的常规使用
  • Swift 周报 第三十四期
  • [虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密
  • Jmeter组件作用域及执行顺序
  • 题目:2309.兼具大小写的最好英文字母
  • RISC-V公测平台发布:如何在SG2042上玩转OpenMPI
  • Jenkins 使用
  • 使用go-zero快速构建微服务
  • Java开发 - Redis事务怎么用?
  • Windows Server 2019安装使用PostgreSQL 15
  • 中科驭数亮相DPU峰会,分享HADOS软件生态实践和大数据计算方案,再获评“匠芯技术奖”
  • chrome、edge、Firefox关闭音量提醒控件显示
  • 3.7v升压5v4A芯片用什么型号
  • 鉴源实验室丨SOME/IP协议安全攻击
  • 什么?200?跨域?
  • 【数据结构与算法——TypeScript】算法的复杂度分析、 数组和链表的对比
  • 搜索综合训练
  • snowboy+新一代kaldi(k2-fsa)sherpa-onnx实现离线语音识别【语音助手】
  • APT80DQ20BG-ASEMI快恢复二极管80A 200V
  • Go的任务调度单元与并发编程