Bootstrap ClassLoader 是用 C++ 实现的 JVM 底层组件,负责在 Java 运行时未就绪前加载核心类(如 java.lang.Object)、初始化内存结构、解析 JAR 字节码,并启动 Launcher 以建立后续类加载体系。

Bootstrap ClassLoader 不是 Java 类,而是 JVM 启动时由 C++ 直接构建并运行的底层组件。它不依赖任何 Java 层代码,也不受 Java 类加载机制约束——它是整个类加载体系的起点和基石。
为什么 Bootstrap ClassLoader 必须用 C++ 实现
它要完成 JVM 自身初始化所需的最原始工作,包括:
- 在 Java 堆、方法区等内存结构尚未建立前,就完成核心类(如 java.lang.Object、java.lang.Class)的加载与链接;
- 不能依赖 ClassLoader 的 Java 接口或任何已加载的类——因为这些类本身就得靠它来加载;
- 必须能直接解析 ZIP/JAR 格式字节码、读取元数据、校验常量池,而这些操作需绕过 Java 运行时,直通操作系统文件系统和内存管理。
启动路径如何被 C++ 初始化
JVM 启动过程中,C++ 层通过多级函数调用拼出默认 boot classpath,关键步骤如下:
- 从环境变量 JAVA_HOME 或启动参数推导基础路径;
- 调用 os::set_boot_path()(位于 hotspot/src/os/xxx/vm/os.cpp)生成完整路径字符串,例如:
/jre/lib/resources.jar:/jre/lib/rt.jar:/jre/lib/sunrsasign.jar; - 该路径最终存入 JVM 全局参数结构体(Arguments 类),供后续类加载逻辑使用;
- 支持运行时覆盖:通过 -Xbootclasspath 或 -Xbootclasspath/a 修改,C++ 层会重新解析并合并路径链表。
核心类库加载的关键行为
Bootstrap ClassLoader 加载的不是“任意类”,而是 JVM 语义必需的“启动类”:
立即学习“C++免费学习笔记(深入)”;
- 只加载名称匹配白名单的类,比如以 java.、javax.、sun.(部分)开头的类;
- 对 String、System、ClassLoader 等类,不仅加载字节码,还触发早期初始化(如静态字段赋值、
执行); - 不走双亲委派——它没有父加载器,所有请求都由自己处理;
- 加载失败直接导致 JVM 初始化失败(如找不到 java.lang.Object 会抛出 FatalError 并退出)。
它和 Java 层 Launcher 的关系
Bootstrap ClassLoader 完成自身职责后,会加载并启动第一个 Java 类:sun.misc.Launcher:
- Launcher 是 Java 编写的,但它由 C++ 层直接通过 native 方法加载(不经过 Java 的 ClassLoader.defineClass 流程);
- Launcher 创建 ExtClassLoader 和 AppClassLoader,并将它们注册为子加载器;
- 从此,Java 层的类加载才真正进入双亲委派模型——但 Bootstrap 始终游离于该模型之外,是模型存在的前提而非参与者。


















