双亲委派机制
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核心代码不会被篡改。