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