类加载过程和双亲委派模型

类加载过程

加载-->链接【验证、准备、解析】-->初始化-->使用-->卸载【GC】

  1. 加载:将字节码文件加载到jvm内存中
  2. 验证:验证字节码文件的格式、符号等的正确性
  3. 准备:给一些static变量分配内存,设置初始值【0或null】【不包含final修饰的变量】
  4. 解析:将常量池中的符号引用替换为直接引用的过程.直接引用为直接指向目标的指针或者相对偏移量等.
  5. 初始化:主要完成静态块执行以及静态变量的赋值.先初始化父类,再初始化当前类.只有对类主动使用时才会初始化.
    触发条件包括,创建类的实例时,访问类的静态方法或静态变量的时候,使用Class.forName反射类的时候,或者某个子类初始化的时候.

Java自带的加载器加载的类,在虚拟机的生命周期中是不会被卸载的,只有用户自定义的加载器加载的类才可以被卸.

双亲委派模型

image

说明

  • 双亲委派的实质是向上委派和向下查找的配合。
  • 3个类加载器是jdk自带的类加载器,从上往下依次为父子关系。
  • 3个类加载器都有严格的类加载路径,不会随便加载。
    1. 引导类加载器主要加载 jdk中rt.jar
    2. 扩展类加载器主要加载ext包下的类
    3. 系统类加载器主要加载自己写项目下的代码
      代码演示
        // 获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        // 获取扩展类加载器
        ClassLoader extClassLoad = systemClassLoader.getParent();
        // 获取引导类加载器
        ClassLoader bootClassLoad = extClassLoad.getParent();
        System.out.println("系统类加载器:"+systemClassLoader);
        System.out.println("扩展类加载器:"+extClassLoad);
        System.out.println("引导类加载器:"+bootClassLoad);
    }

image

作用

  1. 避免类被重复加载
  2. 避免jdk的核心api被篡改
posted @ 2025-09-11 17:37  半吊子喵  阅读(15)  评论(0)    收藏  举报
s