JVM工作原理与实战(十四):JDK9及之后的类加载器

前言

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了JDK8及之前的类加载器、JDK9及之后的类加载器等内容。 ​


一、JDK8及之前的类加载器

JDK8及之前的版本中,扩展类加载器和应用程序类加载器的源码位于rt.jar包中的sun.misc.Launcher.java。默认的类加载器层次结构如下:

  • 启动类加载器(Bootstrap):这是最顶层的类加载器,负责加载Java的核心类库,如java.lang包中的类等。它是用C++编写的,是Java虚拟机底层实现的一部分。
  • 扩展类加载器(Extension):这是Bootstrap的子类加载器,负责加载Java的扩展类库。它是ClassLoader的子类,通过调用父类的loadClass()方法来加载类。
  • 应用程序类加载器(Application):这是Extension的子类加载器,负责加载应用程序的类。它是ClassLoader的子类,通过调用父类的loadClass()方法来加载类。

详细讲解可以查看之前的文章:

JVM工作原理与实战(八):类加载器的分类 - 掘金 (juejin.cn)

JVM工作原理与实战(九):类加载器-启动类加载器 - 掘金 (juejin.cn)

JVM工作原理与实战(十):类加载器-Java类加载器 - 掘金 (juejin.cn)

二、JDK9及之后的类加载器

在JDK9发布之后,Java引入了模块化系统,导致类加载器在设计上产生了重大变革。为了适应这一变化,Java类被封装在jmod文件中,并保存在名为jmods的文件夹中。这样的结构有助于更好地管理和组织Java类,同时提高代码的可维护性和安全性。

1.启动类加载器

在JDK 9及之后的版本中,启动类加载器是用Java编写的,并位于jdk.internal.loader.ClassLoaders类中。

在Java中,BootClassLoader从模块中寻找要加载的字节码资源文件,这是通过继承自内置类加载器BuiltinClassLoader并实现相应的功能来实现的。

值得注意的是,启动类加载器仍然无法通过Java代码直接获取,返回值仍然是null,从而保持了统一性。

2.平台类加载器(扩展类加载器)

在JDK 9及之后,扩展类加载器被替换为平台类加载器。这个类加载器遵循模块化方式加载字节码文件,因此它的继承关系从URLClassLoader变为了BuiltinClassLoader。BuiltinClassLoader实现了从模块中加载字节码文件的功能。平台类加载器的存在更多的是为了与老版本的设计方案兼容,自身并没有特殊的逻辑。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了JDK8及之前的类加载器、JDK9及之后的类加载器等内容,希望对大家有所帮助。

相关推荐
华如锦38 分钟前
面了很多 Java转AI Agent方向,一些面试题总结
java·开发语言·人工智能·python·ai
睡不醒男孩03082340 分钟前
CLup 6.x 版本中针对StarRocks 存算一体集群的完整操作手册
java·服务器·网络·clup
程序员黑豆1 小时前
Java中怎么实现字符串拼接呢【AI全栈开发】
java
fox_lht2 小时前
15.3.改进我们之前的输入、输出项目
开发语言·后端·学习·rust
大鸡腿同学2 小时前
用 AI 肝了一个星期的智能客服助手,看看怎么个事
后端
IT_陈寒2 小时前
Python的os.path.join居然能这么坑?
前端·人工智能·后端
java1234_小锋2 小时前
LangChain4j 开发Java Agent智能体- 多模态支持
java·开发语言·langchain4j
艳阳天_.2 小时前
星瀚弹框页面实现
java·前端·python
张忠琳2 小时前
【Go 1.26.4】Golang Channel 深度解析
开发语言·后端·golang