【JAVA基础】JVM双亲委派

JVM双亲委派

双亲委派机制

复制代码
双亲委派是一个孩子向父亲方向,然后父亲向孩子方向的双亲委派过程

总结:自下(从 App 开始)而上进行检查,自上而下进行加载。

双亲委派模型的工作流程是 :如果一个类加载器收到了类加载的请求,它首先不会自己去尝

试加载这个类,而是把请求委托给父加载器去完成,依次向上,因此,所有的类加载请求最终都

应该被传递到顶层的启动类加载器中,只有当父加载器在它的搜索范围中没有找到所需的类时,

即无法完成该加载,子加载器才会尝试自己去加载该类。

双亲委派机制

  • ➢ 当 AppClassLoader 加载一个 class 时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器 ExtClassLoader 去完成。
  • ➢ 当 ExtClassLoader 加载一个 class 时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给 BootStrapClassLoader 去完成。
  • ➢ 如果 BootStrapClassLoader 加载失败(例如在 $JAVA_HOME/jre/lib 里未查找到该 class),会使用 ExtClassLoader 来尝试加载;
  • ➢ 若 ExtClassLoader 也加载失败,则会使用 AppClassLoader 来加载,如果 AppClassLoader 也加载失败,则会报出异常 ClassNotFoundException。

为什么进行双亲委派?

双亲委派机制的好处主要有以下几点:

  • ➢ 避免类的重复加载:在 JVM 中,每个类都由一个唯一的全限定名和一个对应的类加载器确
    定,类加载器根据全限定名和类路径来确定类的位置。因此,在一个 JVM 实例中,如果有
    两个类加载器分别加载了同一个类,JVM 会认为这两个类是不同的,从而导致类型转换异
    常等问题。通过双亲委派机制,父类加载器在加载类之前会先委托给自己的父类加载器去加
    载,从而保证一个类在 JVM 中只会有一份,并且由其父类加载器所加载。
  • ➢ 安全性考虑:Java 核心类库(如 java.lang 包下的类)都是由启动类加载器加载的,其他的类都是由其它类加载器加载的。这样,我们就可以保证 Java 核心类库的安全性,因为不
    同的应用程序无法改变这些类的实现。另外,也可以在类加载过程中做一些安全性检查。
  • ➢ 模块化开发:在实际应用中,我们经常需要在一个程序中使用多个第三方库,这些库可能会
    存在同名类。如果使用了双亲委派机制,就可以保证不同的类加载器只会加载自己的类,从
    而避免了类名冲突的问题。

为什么要设计这种机制?

这种设计有个好处是,如果有人想替换系统级别的类:String.java。篡改它的实现,在这种

机制下这些系统的类已经被 Bootstrap classLoader 加载过了(为什么?因为当一个类需要加载

的时候,最先去尝试加载的就是 BootstrapClassLoader),所以其他类加载器并没有机会再去

加载,从一定程度上防止了危险代码的植入。

思考一下上面这段代码输出什么?

想好了吗,公布答案了。

你答对了吗?是不是和你想得有点不一样呢。

相关推荐
晨曦中的暮雨21 小时前
Virtual Thread 优化 Spring AI 阻塞式 LLM I/O:对照压测报告
java·并发·个人项目
脚踏实地皮皮晨21 小时前
003003001_Grid控件
开发语言·windows·算法·c#·visual studio
十年磨剑走天涯21 小时前
C++ STL 容器操作复杂度速查表
开发语言·c++
always_TT21 小时前
【Python requirements.txt 依赖管理】
开发语言·python
15Moonlight21 小时前
C++进阶(09):特殊类设计
开发语言·c++
宁风NF21 小时前
JavaScript:网络请求与前端通信
开发语言·前端·javascript·网络·学习·ecmascript
AKA__Zas21 小时前
芝士算法(前缀和2.0)
java·数据结构·算法·leetcode·哈希算法·学习方法
Logintern0921 小时前
py文件开头为什么需要加:from __future__ import annotations
开发语言·python
caishenzhibiao1 天前
降雨带波段点差 同花顺期货通指标
java·c语言·c#