JVM 双亲委派机制

一.类的加载器:

1.引导类加载器(Bootstrap ClassLoader):

  • java的核心类库都是引导类加载器负责加载的。主要是调用底层C/C++的方法。不能被java程序获取到
  • 没有父亲加载器
  • 安装在JAVA_HOME/jre/lib/rt.jar、resources.jar或sun.boot.class.path路径下的内容
  • 出于安全考虑,Bootstrap启动类加载器只加载包名为java、javax、sun等开头的类

2.扩展类加载器(Extension ClassLoader):

  • 用java 语言编写
  • 派生与ClassLoader类
  • 父类加载器为启动类加载器
  • jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动有扩展加载类加载。

3.系统类加载器(System ClassLoader):

  • 对于用户自定义来说,默认使用系统类加载器。
  • 父类加载器为扩展类加载器
  • 一般来说,java应用类的都是由它来完成的
  • 通过ClassLoader getSystemClassLoader()方法获取到该类加载器。

4.自定义类加载器:

继承类ClassLoader类,实现自己的类的加载器,以满足一些特殊的需求。
JVM 双亲委派机制
JVM 双亲委派机制

二.双亲委派机制:

1.工作原理:

JVM 双亲委派机制

  1. 如果以一个类的加载器收到了类加载请求:它并不会自己去加载,而是把这个请求委托给父类的加载器去执行;
  2. 如果父类加载器还存在器其父类加载器,则进一步向上委托,一次递归。请求最终到达顶层的启动类加载器;
  3. 如果父类加载器可以完成任务,就成功返回。倘若父类加载器无法完成加载任务,子类加载器会尝试自己去加载。

2.案例:

JVM 双亲委派机制
我们额外定义了一个java.lang.String 然后运行String类中的main方法:
这时,程序报错。找不到main方法
用双亲委派机制来解释:加载器先加载启动类记载器(Bootstrap)然后顺着java.lang.String 中没有找到main方法。所以报错。