【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.破坏双亲委派机制可能会带来安全风险,因此需要谨慎操作。
相关推荐
剑锋所指,所向披靡!2 小时前
C++之类模版
java·jvm·c++
给我来一根6 小时前
用户认证与授权:使用JWT保护你的API
jvm·数据库·python
哈哈不让取名字8 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python
程序员敲代码吗8 小时前
Python异步编程入门:Asyncio库的使用
jvm·数据库·python
AADNsLUt10 小时前
天牛须算法优化BP神经网络、SVM和核极限学习机在预测与分类中的应用
jvm
偷星星的贼1111 小时前
如何为开源Python项目做贡献?
jvm·数据库·python
被星1砸昏头12 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
enfpZZ小狗12 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
Java程序员威哥13 小时前
云原生Java应用优化实战:资源限制+JVM参数调优,容器启动快50%
java·开发语言·jvm·python·docker·云原生
多多*13 小时前
程序设计工作室1月21日内部训练赛
java·开发语言·网络·jvm·tcp/ip