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

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

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

想好了吗,公布答案了。

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

相关推荐
仙俊红16 分钟前
Integer\int对比,equals()\hashcode面试
java·面试·职场和发展
WiChP29 分钟前
【V0.1B10】从零开始的2D游戏引擎开发之路
java·数据库·游戏引擎
一然明月42 分钟前
qt基本用法
开发语言·qt
云烟成雨TD42 分钟前
Spring AI Alibaba 1.x 系列【60】检查点机制原理与全流程剖析
java·人工智能·spring
ForgeAI码匠1 小时前
Maven 多模块项目如何避免越写越乱?Forge Admin 的模块边界实践
java·人工智能·开源·maven
hef2881 小时前
Prism图形设计从入门到精通:外观设置、图层顺序与微调技巧
开发语言
z落落1 小时前
C# 数组 最终完整版全套笔记(一维+多维+交错+引用类型+对象数组)
java·笔记·c#
Access开发易登软件1 小时前
Access 和 SQLite,根本不在一个赛道上
java·jvm·数据库·sqlite·excel·vba·access开发
小马爱打代码1 小时前
Spring源码 第十篇:Spring 5 源码深度拆解 - Spring 类型转换与校验体系
java·spring
长谷深风1111 小时前
Java 面试高频:反射机制与异常体系全面解析
java·开发语言·面试·exception·java 反射·java 异常·class 对象