HotSpot JVM中rt.jar的加载原理、时机及对应源码位置咨询
HotSpot JVM 中 rt.jar 的加载机制说明
适用范围:该逻辑为JDK 8及更早版本HotSpot的专属实现,JDK 9及之后模块系统已完全替代rt.jar的类库组织形式,不存在独立的rt.jar加载流程
具体加载时机
- rt.jar的路径挂载动作发生在虚拟机核心全局初始化阶段,启动时序早于应用类加载器实例创建、主类加载的全流程
- 完整启动时序参考:初始化运行时全局环境 → 装配启动类加载器的类搜索路径(完成rt.jar路径的登记) → 创建应用类加载器实例并建立双亲委派委托链 → 加载程序入口主类
- 注意:rt.jar不会被一次性全量加载进内存,仅完成路径登记后,当第一个被引用的核心类(比如
java.lang.Object)需要加载时,才会按需从rt.jar中读取对应类的字节码
核心加载实现逻辑
- 路径装配环节:HotSpot会结合JDK安装目录结构、用户传入的
-Xbootclasspath等启动参数,拼出rt.jar的绝对路径(默认路径为<JDK_HOME>/jre/lib/rt.jar),将其加入启动类加载器的专属搜索列表,该列表与应用类加载器的搜索路径完全隔离 - 类匹配读取环节:当启动类加载器需要加载目标类时,会遍历bootstrap搜索列表,通过jar包内置的索引信息快速定位对应class文件的存储位置,直接读取原始字节码,不走应用类的通用校验流程
- 类标记环节:从rt.jar中加载完成的类会被打上“bootstrap类来源”的标记,在后续安全权限检查中自动获得最高优先级的信任级,跳过常规的签名、包边界校验
可查阅的实现代码位置
- 启动类加载器搜索路径装配、rt.jar路径定位的核心实现:
src/hotspot/share/classfile/classLoader.cpp下的setup_bootstrap_search_path()方法,同目录下systemDictionary.cpp中包含类加载触发的关联逻辑 - 从jar包中读取类字节码、通过索引定位class位置的实现:
src/hotspot/share/classfile/jarLoader.cpp - 类加载器初始化的触发时机逻辑:
src/hotspot/share/runtime/threads.cpp中VM核心线程初始化完成后的全局初始化流程
常见认知纠偏:不少教程会描述“JVM启动时就把整个rt.jar加载到内存”,该说法不符合实际实现——整个启动流程仅会完成rt.jar的路径挂载,不会遍历读取jar内的所有内容,全量加载几十M的rt.jar带来的内存开销在实际运行中完全没有必要。
内容的提问来源于stack exchange,提问作者Amos
相关产品推荐
相关产品推荐

