022-JVM-各类加载器加载哪些类?(类加载器的势力范围)

249 阅读2分钟

上一篇: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. 总结

  1. 由来自己的实例范围,当需要去加载某个类的时候就会扫描自己的势力范围,如果在则加载,如果不在就给孩子。
  2. 需要说明的是这里类肯定在内存中没有,才会被加载,如果内存中已经有了则不会被二次加载。
    下一篇:023-JVM-类加载器源码分析https://yuhongliang.blog.csdn.net/article/details/111566920