【JVM中存在3个默认的类加载器】
- BootstrapClassLoader 根类加载器:它负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class。
- ExtClassLoader 扩展类加载器:它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。
- AppClassLoader 应用类加载器:它负责在JVM启动时加载来自Java命令的-classpath选项、java.class.path系统属性,或者CLASSPATH环境变量所指定的JAR包和类路径。
【3个类加载器之间的关系】
- AppClassLoader的父加载器是ExtClassLoader;
- ExtClassLoader的父加载器是BootstrapClassLoader。
【JVM中类的加载过程】
- JVM在加载一个类时,会调用AppClassLoader的loadClass方法来加载这个类,不过在这个方法中,会先使用ExtClassLoader的loadClass方法来加载类,同样ExtClassLoader的loadClass方法中会先使用BootstrapClassLoader来加载类,如果BootstrapClassLoader加载到了就直接成功,如果BootstrapClassLoader没有加载到,那么ExtClassLoader就会自己尝试加载该类,如果没有加载到,那么则会由AppClassLoader来加载这个类。
所以,双亲委派——指得是,JVM在加载类时,会委派给ExtClassLoader和BootstrapClassLoader进行加载,如果没加载到才由自己进行加载。