上一篇:021-JVM-双亲委派机制
https://yuhongliang.blog.csdn.net/article/details/111565510
- 上篇说到各类加载器再第二次得到加载一个类的时候,会在自己的视力范围内查找这个类是否存在,如果存在就加载,如果不存在就给自己孩子传出去。
- 第一次拿到的时候需要给自己的爸爸,当然了bootstrapClassLoader没有爸爸,就是第一次拿到的时候了。
那么这三个类加载器的实例范围,或者首查找的范围是什么?
1. BootStrapClassLoader的实例范围在sun.boot.class.path中
2. ExtClassLoader的实例范围在java.ext.dirs中
3. AppClassLoader的实例范围在java.class.path中
4. 这些key的背后都要哪些类呢?
下面的列子可以看出具体类的情况,让你不再疑惑
4.1 测试代码
package com.yuhl.classload;
/**
* @author yuhl
* @Date 2020/12/22 13:17
* @Classname getClassLoaderDetail
* @Description 查看ClassLoader都加载了那些
*/
public class getClassLoaderDetail {
public static void main(String[] args) {
String pathBoot = System.getProperty("sun.boot.class.path");
System.out.println("BootStrapClassLoader实例范围开始--------------------");
System.out.println(pathBoot.replaceAll(";", System.lineSeparator()));
System.out.println("BootStrapClassLoader实例范围结束--------------------");
System.out.println("ExtClassLoader实例范围开始--------------------");
String pathExt = System.getProperty("java.ext.dirs");
System.out.println(pathExt.replaceAll(";", System.lineSeparator()));
System.out.println("ExtClassLoader实例范围结束--------------------");
System.out.println("AppClassLoader实例范围开始--------------------");
String pathApp = System.getProperty("java.class.path");
System.out.println(pathApp.replaceAll(";", System.lineSeparator()));
System.out.println("AppClassLoader实例范围结束--------------------");
}
}
4.2 测试结果
BootStrapClassLoader实例范围开始--------------------
C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\sunrsasign.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar
C:\Program Files\Java\jdk1.8.0_201\jre\classes
BootStrapClassLoader实例范围结束--------------------
ExtClassLoader实例范围开始--------------------
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext
C:\WINDOWS\Sun\Java\lib\ext
ExtClassLoader实例范围结束--------------------
AppClassLoader实例范围开始--------------------
C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar
C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar
D:\AA\JVM\out\production\Jvm2020
C:\Program Files\JetBrains\IntelliJ IDEA 2020.1\lib\idea_rt.jar
AppClassLoader实例范围结束--------------------
Process finished with exit code 0
5. 总结
- 由来自己的实例范围,当需要去加载某个类的时候就会扫描自己的势力范围,如果在则加载,如果不在就给孩子。
- 需要说明的是这里类肯定在内存中没有,才会被加载,如果内存中已经有了则不会被二次加载。
下一篇:023-JVM-类加载器源码分析https://yuhongliang.blog.csdn.net/article/details/111566920