JVM - 类加载器

Heer Liu

JVM(Java Virtual Machine)是Java程序的运行环境,它能够将Java代码转换成可执行的字节码,并在不同平台上运行。在JVM中,类加载器(Class Loader)负责将Java字节码加载到JVM中。

类加载器概述

类加载器是JVM中的一个重要组件,它主要用于加载Java类和资源文件。在JVM中,类加载器会按照一定的顺序查找需要加载的类,如果类没有被加载,则会通过类加载器将其加载到内存中。

JVM中存在三种类加载器

  1. 启动类加载器(Bootstrap ClassLoader):负责加载Java的核心类库,如java.lang包中的类。
  2. 扩展类加载器(Extension ClassLoader):负责加载Java扩展库,如javax.*包中的类。
  3. 应用程序类加载器(Application ClassLoader):负责加载应用程序的类,即我们自己编写的类。
  4. 自定义类加载器:开发者可以通过继承ClassLoader类来创建自定义的类加载器,以满足特定的需求。

Java 9之前的类加载器

在Java 9之前,JVM中的类加载器存在两个问题:

  1. 命名空间污染:由于每个类加载器都有自己的命名空间,因此可能会导致多个类加载器加载同一个类,从而引发命名空间污染问题。
  2. 无法卸载类:由于JVM中的类加载器不支持卸载已经加载的类,因此可能会导致内存泄漏问题。

为了解决这些问题,Java 9引入了一种新的类加载器架构。

Java 9之后的类加载器

在Java 9中,JVM中的类加载器被重新设计为:

Java9类加载器

  1. 启动类加载器:负责加载Java的核心类库,如java.lang包中的类。
  2. 平台类加载器:负责加载Java扩展库,如javax.*包中的类。
  3. 应用程序类加载器:负责加载应用程序的类,即我们自己编写的类。
  4. 模块类加载器:负责加载模块中的类。

Java 9中的模块化系统为JVM类加载器带来了一些重大变化,可以解决Java 9之前存在的问题。

模块化类加载器

在Java 9中,每个模块都有自己的类加载器,这些类加载器由模块路径(Module Path)上的模块描述符(Module Descriptor)指定。模块描述符是一个文件,它描述了模块的依赖关系和导出的包。模块加载器会按照模块描述符中指定的依赖关系来加载模块,并将其放置在自己的命名空间中。

模块化类加载器具有以下特点:

  1. 命名空间隔离:每个模块都有自己的命名空间,避免了命名空间污染问题。
  2. 可卸载性:由于每个模块都有自己的类加载器,因此可以卸载整个模块,避免了内存泄漏问题。

模块路径和类路径

在Java 9中,存在两种类路径:

  1. 模块路径(Module Path):它用于指定模块所在的路径,其中包括了每个模块的描述符和类文件。模块路径是Java 9中新增的概念,它是实现模块化的关键。
  2. 类路径(Class Path):它用于指定非模块化代码所在的路径,其中包括了每个类文件和JAR文件。类路径是Java早期就存在的概念,在Java 9中仍然保留。

总结

Java 9引入了模块化系统,它将Java代码分解为更小、更简单的组件,并将其打包成模块。每个模块都有自己的依赖关系和导出的API。这种模块化系统使得Java应用程序更加易于开发、维护和部署。

在Java 9中,类加载器被重新设计为启动类加载器、平台类加载器、应用程序类加载器和模块类加载器。其中,模块类加载器具有命名空间隔离和可卸载性的特点,这些特点可以避免命名空间污染和内存泄漏问题。

总之,Java 9的类加载器架构是一个重大的变化,它提供了更好的模块化支持,并且解决了Java 9之前存在的一些问题。

  • 标题: JVM - 类加载器
  • 作者: Heer Liu
  • 创建于: 2020-06-12 21:05:46
  • 链接: https://blog.heer.love/posts/4f318695/
  • 版权声明 : 本文章采用 CC BY-NC-SA 4.0 进行许可。
推荐阅读
JVM - 类加载过程 JVM - 类加载过程 JVM - 自定义类加载器 JVM - 自定义类加载器 Java 对象的生命周期 Java 对象的生命周期