02_类加载子系统

02_类加载子系统

    • 一、内存结构概述
    • 二、类加载器与类的加载过程
      • 1、类加载器子系统的作用
      • 2、类加载器ClassLoader的作用
      • 3、类的加载过程
    • 三、类加载器的分类
      • 1、启动类加载器
      • 2、扩展类加载器
      • 3、应用程序类加载器
      • 4、自定义类加载器
      • 5、获取ClassLoader的几种方式
    • 五、双亲委派机制
      • 1、什么是双亲委派机制
      • 2、双亲委派机制的工作原理
      • 3、demo进行佐证
      • 4、双亲委派机制的优势
      • 5、沙箱安全机制
    • 六、其他一些要点
      • 1、JVM中两个class对象是否相等
      • 2、对类加载器的引用
      • 3、类的主动使用和被动使用

一、内存结构概述

  • 类加载器子系统
  • 运行时数据区
  • 执行引擎
    02_类加载子系统_第1张图片

二、类加载器与类的加载过程

1、类加载器子系统的作用

02_类加载子系统_第2张图片

2、类加载器ClassLoader的作用

02_类加载子系统_第3张图片

3、类的加载过程

02_类加载子系统_第4张图片

1)加载

2)链接

3)初始化

三、类加载器的分类

02_类加载子系统_第5张图片

public class ClassLoaderTest {
    public static void main(String[] args) {

        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2

        //获取其上层:扩展类加载器
        ClassLoader extClassLoader = systemClassLoader.getParent();
        System.out.println(extClassLoader);//sun.misc.Launcher$ExtClassLoader@1540e19d

        //获取其上层:获取不到引导类加载器
        ClassLoader bootstrapClassLoader = extClassLoader.getParent();
        System.out.println(bootstrapClassLoader);//null

        //对于用户自定义类来说:默认使用系统类加载器进行加载
        ClassLoader classLoader = ClassLoaderTest.class.getClassLoader();
        System.out.println(classLoader);//sun.misc.Launcher$AppClassLoader@18b4aac2

        //String类使用引导类加载器进行加载的。---> Java的核心类库都是使用引导类加载器进行加载的。
        ClassLoader classLoader1 = String.class.getClassLoader();
        System.out.println(classLoader1);//null
    }
}

1、启动类加载器

02_类加载子系统_第6张图片

2、扩展类加载器

02_类加载子系统_第7张图片

3、应用程序类加载器

02_类加载子系统_第8张图片

public class ClassLoaderTest1 {
    public static void main(String[] args) {
    
        System.out.println("**********启动类加载器**************");
        //获取BootstrapClassLoader能够加载的api的路径
        URL[] urLs = sun.misc.Launcher.getBootstrapClassPath().getURLs();
        for (URL element : urLs) {
            System.out.println(element.toExternalForm());
        }
        //从上面的路径中随意选择一个类,来看看他的类加载器是什么:引导类加载器
        ClassLoader classLoader = Provider.class.getClassLoader();
        System.out.println(classLoader);

        System.out.println("***********扩展类加载器*************");
        String extDirs = System.getProperty("java.ext.dirs");
        for (String path : extDirs.split(";")) {
            System.out.println(path);
        }
    }
}

4、自定义类加载器

5、获取ClassLoader的几种方式

02_类加载子系统_第9张图片

五、双亲委派机制

1、什么是双亲委派机制

2、双亲委派机制的工作原理

02_类加载子系统_第10张图片

3、demo进行佐证

自定义一个 java.lang包,并在其中定义一个String类
02_类加载子系统_第11张图片
在测试方法中加载该类:
02_类加载子系统_第12张图片
结果: 静态代码块【System.out.println(“我是自定义的String类的静态代码块”);】没有执行,说明加载到内存中的并不是自定义的java.lang.String。由于双亲委派机制,实际上是通过引导类加载器加载的java核心类库中的String类

打印加载String类的加载器:结果是null,表明确实是引导类加载器
02_类加载子系统_第13张图片

4、双亲委派机制的优势

02_类加载子系统_第14张图片

5、沙箱安全机制

02_类加载子系统_第15张图片

六、其他一些要点

1、JVM中两个class对象是否相等

02_类加载子系统_第16张图片

2、对类加载器的引用

3、类的主动使用和被动使用

02_类加载子系统_第17张图片

你可能感兴趣的:(Jvm,jvm)