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

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

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

想好了吗,公布答案了。

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

相关推荐
一直学习永不止步1 分钟前
LeetCode题练习与总结:至少有 K 个重复字符的最长子串--395
java·算法·leetcode·字符串·滑动窗口·哈希表·分治
一叶飘零_sweeeet7 分钟前
JVM 中的完整 GC 流程
java·开发语言·jvm
猫爪笔记8 分钟前
JavaSE:运算符 (学习笔记)
java·开发语言·笔记·学习
p-knowledge10 分钟前
javaCV流媒体处理demo
java·javacv
2301_7808538611 分钟前
JVM概述
jvm
百香果果ccc14 分钟前
Java中的集合
java·开发语言
九转成圣22 分钟前
如何在 IntelliJ IDEA 中去掉 Java 方法注释后的空行
java·intellij-idea·idea·intellij idea
潇雷23 分钟前
Netty(3)进阶篇|半包粘包、编解码器
java·后端·netty
数勋API26 分钟前
银行卡归属地查询API接口如何用PHP调用
开发语言·云计算·php
小爬虫程序猿38 分钟前
python爬虫获得淘宝商品类目 API 返回值说明
开发语言·爬虫·python