什么是 JVM?Java 虚拟机架构
Java 中的 JVM 是什么?
Java 虚拟机 (JVM) 是一个提供运行时环境来驱动 Java 代码或应用程序的引擎。它将 Java 字节码转换为机器语言。JVM 是 Java 运行时环境 (JRE) 的一部分。在其他编程语言中,编译器为特定系统生成机器代码。然而,Java 编译器为称为 Java 虚拟机的虚拟机生成代码。
JVM 如何工作?
首先,Java 代码被编译成字节码。这种字节码在不同的机器上被解释。字节码是主机系统和 Java 源代码之间的中间语言。Java 中的 JVM 负责分配内存空间。

在本 JVM 教程中,您将学到:
JVM (Java 虚拟机) 的架构
现在,在本 JVM 教程中,让我们来了解 JVM 的架构。Java 中的 JVM 架构包含类加载器、内存区域、执行引擎等。
1) 类加载器
类加载器是用于加载类文件的子系统。它执行三个主要功能:加载、链接和初始化。
2) 方法区
JVM 方法区存储类结构,如元数据、常量运行时池和方法代码。
3) 堆
所有对象、其相关的实例变量和数组都存储在堆中。此内存由多个线程共享。
4) JVM 语言栈
Java 语言栈存储局部变量及其部分结果。每个线程都有自己的 JVM 栈,在线程创建时同时创建。每次调用方法时都会创建一个新帧,在方法调用过程完成时将其删除。
5) PC 寄存器
PC 寄存器存储当前正在执行的 Java 虚拟机指令的地址。在 Java 中,每个线程都有其单独的 PC 寄存器。
6) 本地方法栈
本地方法栈持有依赖于本地库的本地代码的指令。它用 Java 以外的语言编写。
7) 执行引擎
它是一种用于测试硬件、软件或完整系统的软件。测试执行引擎不携带有关被测产品的任何信息。
8) 本地方法接口
本地方法接口是一个编程框架。它允许运行在 JVM 中的 Java 代码调用库和本地应用程序。
9) 本地方法库
本地库是执行引擎所需的本地库 (C、C++) 的集合。
软件代码编译和执行过程
要编写和执行软件程序,您需要以下内容:
1) 编辑器 – 用于键入程序,可以使用记事本
2) 编译器 – 将您的语言程序转换为本地机器代码
3) 链接器 – 将您主程序中引用的不同程序文件链接在一起。
4) 加载器 – 将文件从二级存储设备(如硬盘、闪存驱动器、CD)加载到 RAM 以供执行。加载会在您执行代码时自动完成。
5) 执行 – 代码的实际执行由您的操作系统和处理器处理。
在此背景下,请参阅以下视频,了解 JVM 的内部工作原理和 JVM (Java 虚拟机) 的架构。
如果视频无法访问,请点击此处
C 代码编译和执行过程
为了理解 Java 中的 Java 编译过程。让我们先快速回顾一下 C 语言中的编译和链接过程。
假设在 main 函数中,您调用了两个函数 f1 和 f2。main 函数存储在文件 a1.c 中。
函数 f1 存储在文件 a2.c 中
函数 f2 存储在文件 a3.c 中
所有这些文件,即 a1.c、a2.c 和 a3.c,都被输入到编译器。输出是相应的对象文件,也就是机器代码。
下一步是借助链接器将所有这些对象文件集成到一个 .exe 文件中。链接器会将所有这些文件组合在一起,并生成 .exe 文件。
在程序运行时,加载器程序会将 a.exe 加载到 RAM 中进行执行。
Java VM 中 Java 代码的编译和执行
现在,在本 JVM 教程中,让我们看看 JAVA 的过程。在您的 main 函数中,您有两个方法 f1 和 f2。
- main 方法存储在文件 a1.java 中
- f1 存储在文件 a2.java 中
- f2 存储在文件 a3.java 中
编译器将编译这三个文件,并生成 3 个相应的 .class 文件,其中包含字节码。与 C 不同,这里没有进行链接。
Java VM 或 Java 虚拟机驻留在 RAM 中。在执行过程中,通过类加载器将类文件加载到 RAM 中。然后会验证字节码是否存在安全漏洞。
接下来,执行引擎会将字节码转换为本地机器代码。这是即时编译。这也是 Java 相对较慢的主要原因之一。
注意: JIT 或即时编译器是 Java 虚拟机 (JVM) 的一部分。它会同时解释功能相似的字节码部分。
为什么 Java 既是解释型语言又是编译型语言?
编程语言可分为:
- 高级语言,例如 C++、Java
- 中级语言,例如 C
- 低级语言,例如汇编
- 最后是最低级的机器语言。
编译器是一种程序,它将一种语言级别程序转换为另一种语言级别程序。例如,将 C++ 程序转换为机器代码。Java 编译器将高级 Java 代码转换为字节码(这也是一种机器代码)。
解释器是一种程序,它将同一级别的一种程序转换为另一种同级别的一种编程语言。例如,将 Java 程序转换为 C++。
在 Java 中,即时代码生成器将字节码转换为同级别的本地机器代码。
因此,Java 既是编译型语言,也是解释型语言。
为什么 Java 慢?
Java 运行缓慢的两个主要原因是:
- 动态链接:与 C 不同,Java 中的链接是在运行时进行的,每次运行程序时都会进行。
- 运行时解释器:Java 中字节码到本地机器代码的转换是在运行时完成的,这进一步降低了速度。
然而,最新版本的 Java 在很大程度上解决了性能瓶颈。
摘要:
- JVM 的全称是 Java Virtual Machine。Java 中的 JVM 是驱动 Java 代码的引擎。它将 Java 字节码转换为机器语言。
- Java 中的 JVM 架构包含类加载器、内存区域、执行引擎等。
- 在 JVM 中,Java 代码被编译成字节码。这种字节码在不同的机器上被解释。
- JIT 代表即时编译器。JIT 是 Java 虚拟机 (JVM) 的一部分。它用于加快执行时间。
- 与其他编译器机器相比,Java 中的 JVM 执行速度可能较慢。