Java虚拟机(JVM)用于java运行环境(JRE)。最初的 JVM 被认为是字节码解释器。由于性能问题,这可能会让人感到有点意外。许多现代语言旨在编译成特定于 CPU 的可执行代码。然而,JVM 执行 Java 程序这一事实有助于解决与基于 Web 的应用程序相关的主要问题。
JVM 执行 Java 程序这一事实也有助于使其稳定。由于JVM负责,程序的执行是由它控制的。因此,JVM 可以构建一个称为沙箱的有限执行区域,其中包含软件,从而防止系统获得无限制的访问。Java 语言中存在的一些限制也改进了保护。Java的JVM架构包括类加载器、执行引擎、内存字段等。
为了理解差异,让我们通过说明 JVM 的工作原理来深入了解这些组件。
· ClassLoader:类加载器的目的是加载类文件。它帮助完成三个主要功能:加载、初始化和链接。
· JVM 语言堆栈: Java 内存存储局部变量和部分计算结果。每个线程都有自己的 JVM 堆栈,在创建线程时创建。调用该方法时,将创建一个新框架,然后将其删除。
· 方法区: JVM 方法区专门存储 Java 应用程序的元数据和代码隐藏文件。
· PC寄存器: PC寄存器保存当前正在执行的Java虚拟机指令地址。Java 中的每个线程都有自己独立的 PC 寄存器。
· 堆:堆中保存了所有对象、数组和实例变量。该内存在多个线程之间共享。
· 执行引擎:它是一种用于测试软件、硬件或完整系统的软件形式。测试执行引擎从不携带任何有关被测试产品的信息。
· 作为执行引擎的本机方法库需要本机库(C、C++),而作为编程框架的本机方法接口是本机方法接口。这使得在 JVM 中运行的 Java 代码能够调用库和本机应用程序。此外,本机方法堆栈具有取决于本机库的本机代码命令。它将存储分配给本机堆或使用任何堆栈类型。
即时 (JIT) 编译器
虽然 Java 是作为解释性语言开发的,但为了提高性能,Java 并不妨碍字节码即时编译为本机代码。因此,在 Java 首次发布后不久,HotSpot JVM 就发布了。HotSpot 中包含即时 (JIT) 字节码编译器。即时 (JIT) 编译器是 JVM 的一部分,根据逐段需求,字节码的选定部分被实时编译为可执行代码。也就是说,根据执行期间的需要,JIT 编译器会编译代码。此外,并非所有字节码序列都会被编译,只有那些将从编译中受益的字节码序列才会被编译。然而,即时方法仍然会导致效率低下。即使对字节码应用动态编译,由于JVM仍然控制着执行环境,因此可移植性和安全性功能仍然存在。
为了理解差异,让我们通过说明 JIT 的工作原理来深入了解组件。
解释字节码时,JVM 的标准实现会减慢程序的执行速度。JIT 编译器在运行时与 JVM 交互,以提高性能并将适当的字节码序列编译为本机机器代码。
硬件而不是 JVM(Java 虚拟机)解释代码。这可以提高执行速度。这可以针对每个文件、每个函数或者任意代码片段来完成;代码通常在接近执行时进行编译(因此称为“即时”),然后进行缓存并在以后重用,而无需重新编译。它执行许多优化:数据分析、从堆栈操作到注册表操作的转换、通过注册表分配减少内存访问、消除公共子表达式。
因此,根据上述知识,我们得出了它们之间的决定性差异,如下表所示:
虚拟机 | 准时生产 |
JVM 代表 Java 虚拟机。 | JIT 代表即时编译。 |
引入 JVM 是为了管理系统内存并为基于 Java 的应用程序提供可传输的执行环境 | JIT 最初发布多年后,是为了提高 JVM 的性能而发明的。 |
JVM 由许多其他组件组成,例如堆栈区域、堆区域等。 | JIT是JVM的组件之一。 |
JVM 将完整的字节代码编译为机器代码。 | JIT 仅将可重用的字节代码编译为机器代码。 |
JVM 提供平台独立性。 | JIT 提高了 JVM 的性能。 |