侧边栏壁纸
博主头像
月伴飞鱼 博主等级

行动起来,活在当下

  • 累计撰写 126 篇文章
  • 累计创建 31 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
JVM

JDK1.8和1.9中类加载器有哪些不同?

月伴飞鱼
2025-04-06 / 0 评论 / 1 点赞 / 14 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. 类加载器简介

JVM 采用**类加载器(ClassLoader)**来动态加载 .class 文件。

从 JVM 角度来看,类加载器分为两类:

  1. 启动类加载器(Bootstrap ClassLoader):用 C++ 实现,属于 JVM 本身的一部分。

  2. 其他 Java 实现的类加载器:继承自 java.lang.ClassLoader,用于加载应用程序类。

2. JDK 1.8 及之前的类加载器

JDK 1.8 及之前,Java 使用 3 种默认类加载器

3. JDK 1.9 之后的类加载器变化

JDK 1.9 引入 Jigsaw 模块化系统(Project Jigsaw),对类加载器进行了调整:

JDK 1.8

JDK 1.9 及之后

变化

扩展类加载器(Extension ClassLoader)

平台类加载器(Platform ClassLoader)

负责加载 JDK 模块化系统中的非核心模块

应用类加载器(Application ClassLoader)

应用类加载器(Application ClassLoader)

负责加载应用程序的 classpath

新的 Platform ClassLoader(平台类加载器)

  • JDK 1.9 之后,扩展类加载器被移除,改为 Platform ClassLoader

  • Platform ClassLoader 作用

    • 负责加载 JDK 平台 API 的非核心模块(如 java.sql)。

    • 不能直接访问 java.base 模块(由 Bootstrap ClassLoader 加载)。

    • 无法直接访问 classpath,但可以通过 ModuleLayer 访问。

4. JDK 1.8 vs JDK 1.9 类加载器结构

JDK 1.8 类加载器结构

Bootstrap ClassLoader
  ├── Extension ClassLoader
  │     ├── 加载 JAVA_HOME/lib/ext 目录
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

JDK 1.9 类加载器结构

Bootstrap ClassLoader
  ├── Platform ClassLoader  (JDK 9+ 新增)
  │     ├── 加载 JDK 平台模块(如 java.sql)
  ├── Application ClassLoader
        ├── 加载 classpath 目录
        ├── 自定义类加载器(User-defined ClassLoader)

5. 类加载器的继承关系

类加载器并不是继承关系,而是 组合关系,即父类加载器是一个 ClassLoader 类型的成员变量

public abstract class ClassLoader {
    private final ClassLoader parent;  // 组合关系
}

ClassLoader 内部,如果找不到类,会委派给 parent 继续查找

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
    Class<?> c = findLoadedClass(name);
    if (c == null) {
        if (parent != null) {
            c = parent.loadClass(name, false);
        } else {
            c = findBootstrapClassOrNull(name);
        }
    }
    return c;
}

6. 关键变化总结

JDK 版本

主要类加载器

变化

JDK 1.8 及之前

Bootstrap、Extension、Application

使用 Extension ClassLoader 加载 lib/ext

JDK 1.9 及之后

Bootstrap、Platform、Application

Extension ClassLoaderPlatform ClassLoader 取代

7. 影响

  1. 模块化影响类加载

    • JDK 1.9 之后,类被封装在 module-info.java 中,非公开模块不能被直接访问

  2. Platform ClassLoader 只能加载特定的 JDK 模块

    • 不能直接加载 classpath 中的类。

  3. 自定义类加载器仍然适用

    • 但需要在模块化环境下遵循新的访问规则。

8. 结论

  • JDK 1.9 之后,Platform ClassLoader 替代了 Extension ClassLoader

  • 类加载器仍然遵循双亲委派模型,但模块化影响了类加载机制

  • 自定义类加载器仍然适用,但需要遵循模块化规则

公众号.png

1
JVM
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
    1. 支付宝打赏

      qrcode alipay
    2. 微信打赏

      qrcode weixin
博主关闭了所有页面的评论