1.1.1.1 bootstrap class loaderhtml
引导类加载器/启动类加载器,用来加载java的核心库。主要是 jre/lib目录(来源于环境变量sun.boot.class.path)。其由c++编写,自己属于虚拟机的一部分,没法在java代码中获取它的引用。java
打印其启动的jar:c++
String[] files = System.getProperty("sun.boot.class.path").split(";");bootstrap
Arrays.asList(files).forEach(System.out::println); api
结果:app
C:\Program Files\Java\jdk1.8.0_151\jre\lib\endorsed\rt_debug.jar (本身添加的debug时用于显示变量的rt.jar)spa
C:\Program Files\Java\jdk1.8.0_151\jre\lib\resources.jar.net
C:\Program Files\Java\jdk1.8.0_151\jre\lib\rt.jardebug
C:\Program Files\Java\jdk1.8.0_151\jre\lib\sunrsasign.jar设计
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jsse.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jce.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\charsets.jar
C:\Program Files\Java\jdk1.8.0_151\jre\lib\jfr.jar
C:\Program Files\Java\jdk1.8.0_151\jre\classes
1.1.1.2 extensions class loader
扩展类加载器,用来加载java的扩展库
打印其启动的jar
String[] extFiles = System.getProperty("java.ext.dirs").split(";");
Arrays.asList(extFiles).forEach(System.out::println);
结果:
C:\Program Files\Java\jdk1.8.0_151\jre\lib\ext
C:\Windows\Sun\Java\lib\ext
1.1.1.3 system class loader/application class loader
系统类加载器
打印其启动的jar
String[] appFiles = System.getProperty("java.class.path").split(";");
Arrays.asList(appFiles).forEach(System.out::println);
结果:
E:\work_space\Study\target\test-classes
E:\work_space\Study\target\classes
D:\mvn_repositroy\org\slf4j\slf4j-api\1.7.22\slf4j-api-1.7.22.jar
D:\mvn_repositroy\ch\qos\logback\logback-core\1.1.8\logback-core-1.1.8.jar
D:\mvn_repositroy\ch\qos\logback\logback-classic\1.1.8\logback-classic-1.1.8.jar
1.1.1.4 自定义加载器
除了引导类加载器,全部的类加载器都有一个父类加载器。
默认状况下,开发人员本身编写的类加载器父类加载器是系统类加载器(除非显示指定了父类加载器)。能够经过getParent()得到(除了父类为引导类加载器)。示意图以下:
java虚拟机是如何断定两个class是相同的:不只要看类的全名是否相同,还要看加载器是否相同。
好比Hello.class是编译后的字节码,若是不自定义加载器,那么只会加载一次这个class,可是若是自定义了两个同级classloader,那么则能够加载两个class。
双亲委托主要概念见下图,设计思想主要是避免同一个类被不一样的加载器加载,致使额外问题。
加载类以前先看看父类有没有,没有的话看看父类能不能加载,父类有的直接复用,父类能加载的本身毫不加载。(自定义类加载器除外,某些时刻属于定制加功能)
1.1.3.1 示意图
http://www.javashuo.com/article/p-vliilzaq-b.html
https://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html
https://www.jianshu.com/p/6e5c2b463b2a
备注:图都是摘录的,理论上来源于上面三个连接。