双亲委派机制

Posted jiezao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双亲委派机制相关的知识,希望对你有一定的参考价值。

1.1定义

JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

1.2流程

技术图片
如图所示,当jvm要加载.class的时候:
1.首先会到自定义加载器(CustomClassLoader)中查找(其实是看运行时数据区的方法区有没有加载),看是否已经加载过,如果已经加载过,则返回字节码。
2.如果自定义加载器(CustomClassLoader)没有加载过,则询问系统类加载器(即AppClassLoader)是否已经加载过.class。如果已经加载过,则返回字节码。
3.如果AppClassLoader没有加载过,则询问标准扩展类加载器(ExtClassLoader)是否已经加载过。如果已经加载过,则返回字节码。
4.如果ExtClassLoader没有加载过,则启动类加载器(BoopStrapClassLoader)是否已经加载过。如果已经加载过,则返回字节码。
5.如果BoopStrapClassLoader依然没有加载过,首先通过BoopStrapClassLoader尝试加载,如果加载成功就返回字节码文件。
6.如果BoopStrapClassLoader加载失败,就尝试ExtClassLoader加载,如果加载成功就返回字节码文件。
7.如果ExtClassLoader加载失败,就尝试AppClassLoader加载,如果加载成功就返回字节码文件。
8.如果AppClassLoader加载失败,就尝试CustomClassLoader加载,如果加载成功就返回字节码文件。
9.如果CustomClassLoader加载失败,就抛出异常ClassNotFoundException。

1.3注意点:

1.开发者无法直接获取到启动类加载器的引用,加载器本质也是一个java类,所以最初始的启动类加载器肯定不是java写的,而是用c++写的。
2.虽说bootStrap、extclassLoader、appclassloader三个是父子类加载器关系,但是并没有使用继承,而是使用了组合关系。

1.4双亲委派机制的作用:

1.保证一个.Class只加载一次。
2.保证java核心代码不会被篡改。













以上是关于双亲委派机制的主要内容,如果未能解决你的问题,请参考以下文章

双亲委派机制

类加载器的双亲委派及打破双亲委派

[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的

阿里预面:谈谈你对双亲委派机制的理解?这个名字有啥问题?如何打破?为啥双亲委派?...

JDBC是如何打破双亲委派模式的

Tomcat打破双亲委派机制执行顺序底层代码原理JVM04_Tomcat JDBC破坏双亲委派机制带来的面试