Java 虚拟机

JVM-Java 虚拟机是一个引擎,它提供运行环境来驱动 Java 代码或应用程序。它将 Java 字节码转换为机器语言。JVM 是 JRE(Java Run Environment-Java 运行环境)的一部分。

  • 在其他编程语言中,编译器为特定系统生成机器代码。但是,Java 编译器为称为 Java 虚拟机的虚拟机生成代码。
  • 首先,Java 代码被编译为字节码。此字节码在不同的机器再被解释
  • 在主机系统和 Java 源之间,字节码是一种中间语言。
  • JVM 负责分配内存空间。

在本教程中,你将学习 -

  • 什么是 JVM?
  • JVM 架构
  • 软件代码编译和执行过程
  • C 代码编译和执行过程
  • Java 代码编译和执行过程
  • 为什么 Java 既解释又编译语言?
  • 为什么 Java 慢?

JVM 架构

让我们了解 JVM 的体系结构。它包含类加载器、内存区域、执行引擎等。

![Java 虚拟机(JVM)及其架构的工作](/img/Java/JVM and its Architecture.png)

1)ClassLoader

类加载器是用于加载类文件的子系统。它执行三个主要功能即加载、链接和初始化。

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)加载到内存中执行。执行代码时会自动完成加载。

5)执行 - 实际执行由你的操作系统和处理器处理的代码。

C 代码编译和执行过程

要了解 Java 中的 Java 编译过程。让我们先快速了解一下 C 中的编译和链接过程。

假设在 main 中,你调用了两个函数 f1 和 f2。主函数存储在文件 a1.c 中。

// a1.c
void main()
{
    f1();
    f2();
}

函数 f1 存储在文件 a2.c

// a2.c
f1()
{
    ;
}

函数 f2 存储在文件 a3.c

// a3.c
f2()
{
    ;
}

所有这些文件,即 a1.ca2.ca3.c,都被送到编译器。其输出是相应的目标文件,即机器代码。

下一步是在链接器的帮助下将所有这些目标文件集成到单个 .exe 文件中。链接器将所有这些文件组合在一起并生成 .exe 文件。

在程序运行期间,加载程序会将 a.exe 加载到内存中以执行。

Java 代码 Java VM 中的编译和执行

让我们看看 JAVA 的过程。在你的主体中,你有两个方法 f1 和 f2。

  • main 方法存储在文件 a1.java
  • f1 存储在文件 a2.java
  • f2 存储在文件 a3.java

![Java 编译器](/img/Java/Java Compiler.jpg)

编译器将编译这三个文件并生成 3 个相应的 .class 文件,该文件由字节码组成。与 C 不同,它们并没有链接在一起。

Java 虚拟机驻留在内存上。在执行期间,使用类加载器将类文件放在内存上。字节码已经针对任何安全漏洞都做了验证。

接下来,执行引擎将字节码转换为原生机器代码。这是即时编译,这就是 Java 相对较慢的主要原因之一。

注意: JIT 或即时编译器是 Java 虚拟机(JVM)的一部分。

为什么 Java 既是解释语言同时又是编译语言?

编程语言分类为

  • 高级语言比如 C++Java
  • 中级语言比如 C
  • 低级语言比如汇编语言
  • 最后最低级别是机器语言

编译器是一个程序,它将程序从一种语言级别转换为另一种语言级别,比如将 C++ 程序转换为机器代码。

Java 编译器将高级 java 代码转换为字节码(也是一种机器代码)。

解释器是一个程序,它将一个级别的程序转换为另一个级别的另一个编程语言,比如将 Java 程序转换为 C++

在 Java 中,即时编码生成器将字节码转换为处于相同编程级别的本机机器代码。

因此,Java 既可以编译也可以解释语言。

Java 为什么慢?

Java 慢的背后的两个主要原因是

  1. **动态链接:**与 C 不同,每次程序在 Java 中运行时,链接都是在运行时完成的。
  2. **运行时解释器:**字节代码转换为本机机器代码是在 Java 运行时完成的,这进一步降低了速度

但是,最新版本的 Java 在很大程度上解决了性能瓶颈问题。

摘要

  • JVM 或 Java 虚拟机是驱动 Java 代码的引擎。它将 Java 字节码转换为机器语言。
  • 在 JVM 中,Java 代码被编译为字节码。此字节码在不同的机器上解释
  • JIT 或 Just-in-time 编译器是 Java 虚拟机(JVM)的一部分。它用于加快执行时间
  • 与其他编译器机器相比,Java 执行速度可能会很慢。