JVM双亲委派机制
1、双亲委派机制
总之就是一句话
向上委派,向下加载
图如下
2、类加载器
JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。
–>JVM规范中提到的.
规范中同时提到,凡是直接或者间接的继承自ClassLoader的类加载器都划分为自定义类加载器。
扩展类加载器(Extension ClassLoader):对应ExtClassLoader类,是Launcher的内部类
系统类加载器(System ClassLoader):对应AppClassLoader,是Launcher的内部类
用户自己定义的加载器(User DefinedClassLoader):继承ClassLoader
都间接的继承自ClassLoader:是一个抽象类,所以他们属于自定义类加载器。
注意1: Bootstrap ClassLoader是用c和c++来编写的,引导类加载器嵌入JVM中,是JVM的一部分.它加载核心类库中内容,所以Extension ClassLoader,System ClassLoader都和核心类库的,所以这两个加载器也是靠Bootstrap ClassLoader来加载的。
Extension ClassLoader,System ClassLoader都是用java编写的,都是是Launcher的内部类。
3、不同加载器可以加载哪些类
3.1、 引导类加载器:
public class Test2 {
public static void main(String[] args) {
//获取引导类加载器能加载哪些路径下的jar文件:
URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();
for (URL element : urLs) {
System.out.println(element.toExternalForm());
}
}
}
3.2、 扩展类加载器
public class Test2 {
public static void main(String[] args) {
//获取扩展类加载器所加载的jar包:
String extDirs = System.getProperty("java.ext.dirs");
//获取一个或多个扩展目录的路径
for (String path : extDirs.split(";")) {
System.out.println(path);
}
}
}
3.3、 系统类加载器
我们自己定义的类
ClassLoader classLoader = Test.class.getClassLoader();
System.out.println(classLoader);
//sun.misc.Launcher$AppClassLoader@18b4aac2
4、等级关系
注意2: 这些加载器有等级关系:(不是子类父类的关系,是一个等级的关系,好比阶级社会人与人之间的关系) Bootstrap ClassLoader>Extension ClassLoader>System ClassLoader>用户自己定义的加载器 (好比阶级社会,有的类你根本没资格被Bootstrap ClassLoader加载,惨兮兮)