Java 架构及其组件


2021年8月23日, Learn eTutorial
2933

在本教程中,我们将讨论 Java 架构及其几个组件。您将掌握三个重要的 Java 组件——JVM、JRE 和 JDK。这包括它们的工作原理以及它们之间的区别。

Java 架构

架构是所有共同定义系统的组件的基本规划,包括结构、接口、通信模式等。Java 的综合架构是多个组件的融合。下面展示了 Java 架构的概要草图。

Java JVM

Java 的首要组件是 Java 应用程序,它包含另外两个组件——Java 编程文件和 Java 类文件。Java 类文件是在编译 Java 源文件时创建的文件。在这里,源代码被转换为与机器无关的字节码。这些字节码随后被传递给 Java 运行时环境(JRE),这是 Java 的另一个重要组件。现在,字节码与类库集成,Java 虚拟机解释这些字节码并将其转换为本地机器码。因此,Java 体现了编译和解释两种技术。

JVM 到底是什么?

JVM 代表 Java 虚拟机。顾名思义,JVM 表现得像一个虚拟处理器,是 Java 的核心元素之一。这个虚拟处理器的主要目标是解释字节码并将其转换为本地机器码。

Java JVM

JVM 在 Java 架构中的位置非常重要。如上图所示,JVM 是 JRE 的一部分,位于操作系统之上。这使得 JVM 能够轻松地与多个操作系统交互,从而使 Java 如此强大和可移植。

JVM 的工作原理

现在让我们深入了解 Java 虚拟机的工作系统。当您观察 Java 架构图时,您可以看到 JVM 由 3 个主要子系统构成。

  1. 类加载器子系统
  2. 运行时数据区(内存区)
  3. 执行引擎

1. 类加载器子系统及其工作原理

类加载器子系统是 Java 虚拟机不可或缺的组成部分。类加载器子系统的职责不仅仅是查找和加载类文件到内存,它还负责验证导入类文件的正确性、为类变量分配和初始化内存等等。所有这些活动都是通过 3 个过程实现的,即

  • 加载
  • 链接
  • 初始化。

加载

这是类加载器子系统的第一阶段,负责执行两个功能。首先是找到虚拟机为特定类请求的字节码文件,其次是将这些字节码加载到主内存中。根据类类型和类路径,类加载器分为三种类型。它们是
引导类加载器

  • 扩展类加载器
  • 应用程序类加载器

链接

这个中间阶段负责将类文件与 JVM 的运行时状态链接起来以便执行。该阶段始于验证过程,其中字节码验证器确保生成的字节码是正确的,即它遵守语言的语义并且不会破坏 JVM 的完整性。
紧接着的下一步是准备阶段,JVM 为所有静态变量分配内存,并根据变量类型为它们分配默认值。
链接阶段以一个称为解析的可选过程结束,在该过程中,JVM 将类、接口、方法等的所有符号引用替换为方法区的具体引用。

初始化

根据 Java 8 虚拟机规范的规定,类或接口的初始化包括执行其类或接口的初始化方法。
到达类加载的最后阶段,该类已准备好在应用程序中积极参与。初始化涉及两个主要功能

  1. 首先,借助程序员概述的一些初始化例程,用原始值初始化所有类变量。
  2. 其次,如果发现该类的超类未初始化,则必须初始化它们

2. 运行时数据区

运行时数据区或内存区是 Java 虚拟机的第二个重要部分。Java 内存主要分为五个部分。它们是

  • 方法区:也称为类区,是加载类字节码以及静态变量和常量的内存。由于一个 JVM 只包含一个方法区,因此它在资源之间共享。
  • :这是分配类对象和数组的内存,是公共的并在多个线程之间共享。对象是在对象名称下创建的实例变量。
  • :简单来说,这个内存区域以帧的形式存储方法并执行。在方法调用时,会形成一个帧,在该方法执行或完成后,该帧被销毁。这也用于嵌套局部变量。
  • PC 寄存器:PC 代表程序计数器。在计算机体系结构中,程序计数器寄存器用于跟踪当前正在执行的指令。它包含当前执行指令的地址,因此充当指针。我们知道 Java 是一个多线程系统,所以每当创建一个线程时,相应地就会形成一个 PC 寄存器。
  • 本地方法栈:本地方法栈用于 JVM 使用本地方法的情况。它包含当前执行的本地于系统的指令的地址。

3. 执行引擎

执行引擎是 Java 虚拟机的核心部分,字节码的执行在此发生。正是这个阶段将人类可读的代码转换为机器语言可执行代码。

执行引擎由三个主要子组件组成。它们是

  • 解释器:Java 虚拟机中的这个组件负责读取和执行 Java 程序。它逐行读取高级代码,并在运行时将其转换为高级语言,从而确保程序的轻松执行。但是,它有一个局限性,即重复转换代码中多次出现的相同方法。
  • JIT 编译器:JIT 代表即时编译。这个 JIT 编译器负责平衡由解释器引起的执行缓慢的局限性。它通过动态编译字节码来提高性能,从而减少了编译所需的总时间。这里的编译器指的是执行复杂优化以创建高质量机器可读代码的转换器
    • 中间代码生成器 – 生成代码的独立中间表示
    • 代码优化器 – 优化中间代码,旨在以更少的资源高效地工作
    • 目标代码生成器 – 生成依赖于机器的代码。
    • 分析器 – 负责定位热点,确定一个方法是否重复多次。
  • 垃圾回收器:Java 虚拟机中的这个子组件帮助 Java 开发人员不必为必须明确释放内存而烦恼。垃圾回收器自动检测未使用或未引用的内存,并将其释放以供以后使用,从而使 Java 内存高效。

Java 本地接口(JNI)

JNI 是一个非 Java 编程接口,用于您不能完全依赖 Java 编写应用程序的情况。有时,您可能需要合并用其他语言(如 C、C++ 等)编写的方法或库来运行您的应用程序。在这种情况下,您可以使用这个本地方法接口,它允许在 JVM 内部执行的 Java 代码与其他语言编写的应用程序和库协同工作。使用此 JNI 框架的主要优点是代码可重用性和高性能。

本地方法库

Java 本地库是包含用非 Java 语言(例如 C、C++ 等)编写的代码或应用程序的库。它们可以根据需要在 JNI 的帮助下包含在 Java 应用程序中。

什么是 JRE?

JRE 代表 Java 运行时环境。顾名思义,它主要用于运行 Java 代码。JRE 包含我们之前讨论过的 Java 虚拟机以及支持运行 Java applet 的其他浏览器插件和工具。JRE 是 JDK 的重要组成部分之一。

什么是 JDK?

JDK,Java 开发工具包的简称,是一个功能丰富的软件开发环境,主要由 Java 程序员用于开发 Java 代码(Java 应用程序或 applet)。它包含构建和执行 Java 代码所需的各种工具,例如

  • JRE (Java 运行时环境)
  • 一个解释器 (java)
  • 一个编译器 (javac)
  • 一个归档器 (jar)
  • 一个文档生成器 (javadoc) 等。

因此,如果您是 JAVA 新手,请明确一点,要在您的系统中开发 Java 代码,您需要做的第一步是将 JDK 下载到您的开发环境中并设置路径。下载时,您可以选择所需的 Java 版本和 Java 版本。Java 版本有 3 种类型:

  1. Java 标准版 (Java SE)
  2. Java 企业版 (Java EE)
  3. Java 移动版 (Java ME)

不要太担心 Java 的安装,您将在我们的下一个教程——WINDOWS 的 JAVA 安装和设置中逐步学习。

JVM vs JRE vs JDK

现在让我们通过比较这 3 个基本组件来总结我们迄今为止学到的所有内容。下面是参考 JVM、JRE 和 JDK 之间关联的最佳可视化图。

Java JVM JDK JRE

差异在下表中列出

  JDK JRE JVM
代表 Java 开发工具包 Java 运行时环境 Java 虚拟机
软件开发工具 软件包 抽象机
用于 开发应用程序 运行应用程序 解释
依赖性 平台相关 平台相关 平台无关
包含 JRE、JVM、类库、编译器、调试器等 JVM、类库 JDK 和 JRE 的子集