双亲委派机制

前言

Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将其class文件加载到内存生成class对象。Java虚拟机采用了双亲委派机制对class文件进行加载。

ClassLoader

JVM中提供了三层的ClassLoader:Bootstrap ClassLoader,ExtClassLoader,APPClassLoader。

  1. Bootstrap ClassLoader:主要负责加载核心的类库(java.lang.*等),构造ExtClassLoader和APPClassLoader。
  2. ExtClassLoader:主要负责加载jre/lib/ext目录下的一些扩展jar。
  3. APPClassLoader:主要负责加载应用程序中的主函数类。

流程

简单说描述下双亲委派机制的流程:

  1. 如果一个类加载器收到了类加载请求,它并不会自己先加载,而是把这个请求委托给父类的加载器去执行。
  2. 如果父类加载器还存在父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的引导类加载器。
  3. 如果父类加载器可以完成类加载任务,就成功返回;如果父类加载器无法完成加载任务,子加载器才会去自己去加载。
  4. 父类加载器逐层向下分配任务,如果加载器能够加载,则加载类,如果家在任务分配至系统类加载器也无法加载此类,则抛出异常。
双亲委派机制.jpg

双亲委派机制的优势

  1. 可以避免类的重复加载
  2. 可以防止核心API被修改。举例来说,如果有人要使用自定义类String替换系统级别的类String,在双亲委派机制中是不可行的。这些系统类会首先逐层委托到Bootstrap ClassLoader时加载,而下面的自定义User ClassLoader就不会再有加载类的机会,避免了此种修改错误。

参考文章

你可能感兴趣的:(双亲委派机制)