【jvm】双亲委派机制

目录

          • [1. 说明](#1. 说明)
          • [2. 类加载器层次结构](#2. 类加载器层次结构)
          • [3. 工作原理](#3. 工作原理)
          • [4. 主要作用](#4. 主要作用)
          • [5. 局限性](#5. 局限性)
          • [6. 破坏双亲委派机制](#6. 破坏双亲委派机制)
1. 说明
  • 1.双亲委派机制(Parent Delegation Model)是Java类加载器的一种工作模式,它确保了类加载的一致性和安全性。
  • 2.双亲委派机制的基本思想是:当一个类加载器试图加载某个类时,它会先委托给其父类加载器,如果父类加载器无法加载,再由当前类加载器自己进行加载。
  • 3.这种层层委派的方式有助于保障类的唯一性,避免类的重复加载,并提高系统的安全性和稳定性。
2. 类加载器层次结构
  • 1.启动类加载器(Bootstrap Class Loader):负责加载Java的核心库,如java.lang.*等。它是最顶层的类加载器,通常由C++编写,不存在父类加载器。
  • 2.扩展类加载器(Extension Class Loader):负责加载Java的扩展库,一般位于<JAVA_HOME>/lib/ext目录下。它的父类加载器是启动类加载器(在实际逻辑中)。
  • 3.应用程序类加载器(Application Class Loader):也称为系统类加载器,负责加载应用程序类路径上指定的类库。它的父类加载器是扩展类加载器。
3. 工作原理
  • 1.检查缓存:类加载器首先检查是否已经加载过该类,如果已经加载过,则直接返回该类。
  • 2.委派父加载器:如果没有加载过该类,类加载器将加载请求委派给父类加载器。
  • 3.递归过程:父类加载器也按照相同的过程处理加载请求,直到委派到启动类加载器。
  • 4.启动类加载器加载:启动类加载器尝试加载类,如果加载成功,则返回该类。
  • 5.逐级回退:如果启动类加载器无法加载该类,加载请求逐级回退到下一级类加载器,直至回退到最初的请求者。
  • 6.自行加载:最终,如果所有父类加载器都无法加载该类,子类加载器才会尝试自行加载。
4. 主要作用
  • 1.保证类加载的安全性:由于双亲委派机制中,顶层的类加载器(如Bootstrap ClassLoader)负责加载核心类库,这种设计可以避免恶意代码替换核心类库,从而确保核心类库的完整性和安全性。
  • 2.避免重复加载:通过双亲委派机制,如果一个类已经被一个类加载器加载过,那么其他的类加载器就无需再次尝试加载,这样可以避免同一个类被多次加载的情况,节省内存并提高性能。
  • 3.保证类的一致性:双亲委派机制确保了同一个类在整个Java应用中只有一个唯一的定义,避免了同名类不同实现的冲突问题。
5. 局限性
  • 1.灵活性不足:双亲委派机制的严格层级关系使得子类加载器很难绕过父类加载器直接加载类,这在某些情况下限制了灵活性。
  • 2.复杂性:实现自定义类加载器时,需要理解和实现双亲委派机制,这增加了开发的复杂性。
6. 破坏双亲委派机制
  • 1.在某些特定需求下,可能需要破坏双亲委派机制,如加载自定义的类或版本不同的类库。
  • 2.这通常通过继承ClassLoader并覆盖loadClass方法或findClass方法来实现。
  • 3.破坏双亲委派机制可能会带来安全风险,因此需要谨慎操作。
相关推荐
m0_748554815 小时前
golang如何实现用户订阅偏好管理_golang用户订阅偏好管理实现总结
jvm·数据库·python
lee_curry6 小时前
第四章 jvm中的垃圾回收器
java·jvm·垃圾收集器
阿正呀7 小时前
Redis怎样实现本地缓存的高效失效通知
jvm·数据库·python
2501_901200537 小时前
mysql如何设置InnoDB引擎参数_优化innodb_buffer_pool
jvm·数据库·python
金銀銅鐵8 小时前
[java] 编译之后的记录类(Record Classes)长什么样子(上)
java·jvm·后端
m0_495496418 小时前
mysql处理复杂SQL性能_InnoDB优化器与MyISAM差异
jvm·数据库·python
forEverPlume9 小时前
PHP怎么使用Eloquent Attribute Composition属性组合_Laravel通过组合构建复杂属性【方法】
jvm·数据库·python
2301_809204709 小时前
mysql在docker容器中如何部署_利用docker-compose快速启动
jvm·数据库·python
2301_8159019713 小时前
SQL如何将多行记录聚合成逗号分隔字符串_GROUP_CONCAT技巧
jvm·数据库·python
zjy2777713 小时前
Layui tab选项卡如何动态根据ID值进行程序化切换
jvm·数据库·python