1、JVM 架构 – 了解 JVM 内部结构
每个Java开发人员都知道字节码将由JRE(Java运行时环境)执行。但许多人不知道JRE是Java虚拟机(JVM)的实现,它分析字节码,解释代码并执行它。作为开发人员,我们应该了解JVM的架构非常重要,这使我们能够更有效地编写代码。在这篇带图表的 Java 中的 JVM 架构文章中,我们将更深入地了解 Java 中的 JVM 架构和 JVM 的不同组件。
2、 什么是Java中的JVM?
虚拟机是物理机的软件实现,Java是根据在VM上运行的WORA**(*一次写入随处运行)* 的概念开发的。编译器会将 java 文件编译为 java .class文件。.class文件被输入到 JVM,JVM 加载并执行类文件**。下面是 JVM 的架构。

3、 JVM在Java中是如何工作的?
如上图架构图所示,JVM分为三个主要子系统
- 类装入器子系统
- 运行时数据区域
- 执行引擎
3.1 类加载器子系统
Java 的动态类装入功能由类装入器子系统处理。当类在运行时(而不是编译时)首次引用类时,它会加载、链接和初始化类。 它执行三个主要功能,例如加载、链接和初始化。
3.2 加载
类将由此组件加载。BootStrap ClassLoader,Extension ClassLoader,Application ClassLoader是三个类加载器,它们将有助于实现它。
- BootStrap ClassLoader – 负责从引导类路径加载类,只有 rt.jar。 此加载程序将具有最高优先级。
- 扩展类加载器 – 负责加载 ext 文件夹 (jre\lib) 内的类
- 应用程序类加载器 – 负责加载应用程序级类路径、提到的环境变量等路径。
上述类装入器在装入类文件时将遵循委派层次结构算法。
3.3 链接
- 验证 – 字节码验证器将验证生成的字节码是否正确,如果验证失败,我们将收到验证错误
- 准备 – 对于所有静态变量,将分配内存并使用默认值分配内存。
- 解决 – 所有符号内存引用都将替换为方法区域中的原始引用。
3.4 初始化
这是类加载的最后阶段,这里所有静态变量都将被分配原始值,静态**块**将被执行。
4、 运行时数据区
运行时数据区分为 5 个主要组件
-
方法区 – 所有类级别数据将存储在此处,包括静态变量。方法区域是每个 JVM 一个,它是一个共享资源。
-
堆区域 – 所有对象及其相应的实例变量和数组将存储在此处。堆区域也是每个 JVM 一个,因为方法区域和堆区域共享多个线程的内存,存储的数据不是线程安全的。
-
堆栈区域 – 对于每个线程,将创建一个单独的运行时堆栈。对于每个方法调用,将在堆栈内存中创建一个条目,称为堆栈帧。所有局部变量都将在堆栈内存中创建。堆栈区域是线程安全的,因为它不是共享资源。堆栈框架分为三个子实体,例如
- 局部变量数组 – 与方法相关,涉及多少局部变量,相应的值将存储在此处。
- 操作数堆栈 – 如果需要执行任何中间操作,操作数堆栈将充当运行时工作区来执行操作。
- 帧数据 – 与该方法对应的所有符号都存储在此处。如果出现任何异常,catch 块信息将保留在帧数据中。
-
PC寄存器 – 每个线程将具有单独的PC寄存器,以保存当前执行指令的地址,一旦指令执行,PC寄存器**将更新为**下一条指令
-
本机方法堆栈 – 本机方法堆栈保存本机方法信息。对于每个线程,将创建单独的本机方法堆栈。
5、 执行引擎
分配给运行时数据区域的字节码将由执行引擎执行。执行引擎读取字节代码并逐个执行。
- 解释器 – 读取字节码,解释它并逐个执行它。解释器解释字节码的速度更快,但执行速度较慢。解释器的缺点是,当一个方法调用多次时,每次都需要解释。
- JIT 编译器 – JIT 编译器抵消了解释器的缺点(调用多次的单个方法,每次都需要解释),执行引擎将使用解释器的帮助进行转换,但是当它发现重复的代码时,它使用 JIT 编译器编译整个字节码并将其更改为本机代码。此本机代码将直接用于重复的方法调用,从而提高系统的性能。
- 中间代码生成器 – 生成中间代码
- 代码优化器 – 代码优化器负责优化上面生成的中间代码
- 目标代码生成器 – 目标代码生成器负责生成机器代码/本机代码
- 探查器 – 探查器是一个特殊的组件,它负责查找热点(即)用于识别该方法是否被多次调用。
- 垃圾收集器:垃圾收集器是执行引擎的一部分,它收集/删除未引用的对象。垃圾回收可以通过调用“System.gc()”来触发,但不能保证执行。JVM 的垃圾回收器只收集那些由 new 关键字创建的对象。因此,如果您创建了没有 new 的任何对象,则可以使用 finalize 方法来执行清理。
Java Native Interface (JNI):JNI 将与 Native Method Libraries 交互,并提供执行引擎所需的 Native Library。
本机方法库: 它是执行引擎所需的本机库的集合。