自学内容网 自学内容网

【JAVA基础】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),所以其他类加载器并没有机会再去
加载,从一定程度上防止了危险代码的植入。

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

想好了吗,公布答案了。
在这里插入图片描述
你答对了吗?是不是和你想得有点不一样呢。


原文地址:https://blog.csdn.net/2403_87669205/article/details/143723096

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!