OpenJDK 20中Platform ClassLoader具体加载哪些类与模块?
问题解答
结论:该说法是正确的,但需结合JVM类加载的懒加载机制与模块分工来理解
首先明确两个核心逻辑:
- JVM类加载采用懒加载机制:只有当类被主动引用时,对应的类加载器才会加载该类所属的模块/包,所以空程序中
Platform ClassLoader没有加载任何内容是正常现象。 Bootstrap ClassLoader与Platform ClassLoader的分工边界:Bootstrap ClassLoader(启动类加载器)负责加载JVM启动必需的核心类库,比如java.lang、java.util、java.util.logging这类最基础的API——这些是JVM运行的底层依赖,启动时就会加载,且由于它是C++实现的底层加载器,返回的ClassLoader对象为null。Platform ClassLoader(平台类加载器)负责加载Java SE平台中不属于启动必需,但开发者在业务开发中可能用到的公共API模块——这些模块属于Java SE规范的一部分,但不是JVM启动的依赖项,会在首次被引用时才触发加载。
具体属于Platform ClassLoader加载范畴的模块/包
常见的包括但不限于:
- Java SE扩展API模块:
java.sql(JDBC数据库访问相关)java.naming(JNDI命名服务相关)java.xml及javax.xml.*(XML处理全系列API)java.desktop(AWT/Swing图形界面相关)java.rmi(远程方法调用相关)java.security.jgss(安全认证相关)
- JDK特定平台模块:
jdk.httpserver(内置HTTP服务器)jdk.crypto.ec(加密扩展模块)jdk.xml.dom(DOM XML处理实现)
结合测试案例的补充说明
- 当你引用
java.sql.Connection时,触发了Platform ClassLoader加载java.sql模块,所以能看到该类的加载器是jdk.internal.loader.ClassLoaders$PlatformClassLoader,且getDefinedPackages()返回了java.sql包。 java.util.logging.ConsoleHandler属于java.logging模块,该模块是JVM启动必需的核心日志组件,由Bootstrap ClassLoader加载,所以返回的ClassLoader为null。
内容的提问来源于stack exchange,提问作者Yahor Barkouski
相关产品推荐
相关产品推荐

