【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),所以其他类加载器并没有机会再去

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

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

想好了吗,公布答案了。

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

相关推荐
爱学习的梵高先生7 分钟前
C++:基础知识
开发语言·c++·算法
oioihoii11 分钟前
C++对象生命周期与析构顺序深度解析
java·开发语言·c++
IMPYLH14 分钟前
Lua 的 tonumber 函数
开发语言·笔记·后端·junit·游戏引擎·lua
BBB努力学习程序设计22 分钟前
Java枚举(Enum):定义固定值的"类型安全"利器
java
It's now42 分钟前
BeanRegistrar 的企业级应用场景及最佳实践
java·开发语言·spring
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 基于Java的小区物业管理系统APP的设计与实现为例,包含答辩的问题和答案
java·开发语言
繁华似锦respect1 小时前
C++ & Linux 中 GDB 调试与内存泄漏检测详解
linux·c语言·开发语言·c++·windows·算法
会编程的林俊杰1 小时前
Mapper解析
java·mybatis
小徐敲java1 小时前
python的FastAPI框架
开发语言·python·fastapi
狼爷1 小时前
yyds,JDK 25 终结 import,可以像 Python 一样简单粗暴了
java