什么是 JVM(Java 虚拟机)?
什么是 JVM(Java 虚拟机)?
Java 虚拟机(JVM)是一个软件组件,它运行开发人员编写的 Java 代码,以便 Java 应用程序正常运行。在 Java 问世之前,程序只能在特定的目标平台上运行。开发人员还必须管理程序的内存使用情况,这非常耗时。借助 JVM,Java 将“一次编写,随处运行”的概念引入了编程语言领域。Java 代码在 JVM 中运行,不依赖于底层平台。JVM、Java 运行时环境(JRE)和 Java 开发工具包(JDK)是 Java 编程所需的三个基本组件。
什么是 JVM 实施?
JVM 包含三个方面:规范、实施和实例。
详述
JVM 规范是一份概述 Java 虚拟机规则、行为和功能的文档。它作为官方参考标准,提供一个标准化的框架,同时保留开发的灵活性。只要遵循该规范,不同的团队就可以创建自己的 JVM。
实施
JVM 实施是指对该规范的软件实施。有多种由不同供应商提供的 JVM 实施。例如,OpenJDK 的 HotSpot 就是一种开源的 JVM 实施。它是许多其他 JVM 实施的基础,并被开发人员、各类组织和 Java 社区广泛使用。它是世界上经过最充分验证的代码库之一。
实例
当您在计算机上运行 Java 时,这意味着您的计算机上正在运行 JVM 的一个特定实例。当开发人员使用“JVM”这一术语时,他们指的是运行在计算机上、负责执行他们所编写 Java 代码的软件。
Java 虚拟机是如何工作的?
在 Java 中,现实世界的实体被表示为 Java 对象。对象具有属性和行为。例如,如果您正在使用 Java 构建预订系统,则可以创建一个包含姓名和地址等属性以及 create_customer 等功能的客户对象。您需要定义一个客户类,作为客户对象的蓝图或模板。
尽管类和对象是 Java 编程的基础,但它们仍然是抽象的表示形式。客户类只是一行文本。JVM 会处理 Java 程序中的文本,并将这些抽象概念转换为设备内存中的物理表示形式。例如,对于代码文本“客户对象 A”,JVM 会为对象 A 创建相应的物理内存组件。
尽管涉及的细节较为复杂,但我们将在下文简要概述这一过程。
- 开发人员编写 Java 代码。
- 开发人员编译 Java 代码。
- JRE 将代码转换为一种称为 Java 字节码的低级表示形式。
- JVM 运行字节码,并根据需要在底层平台上分配和释放内存。
Java 虚拟机架构的关键组件有哪些?
JVM 架构的主要组件如下所述。每个组件都至关重要,并且支持 JVM 实例运行 Java 程序。
类加载器
类加载器负责将 Java 类文件加载到内存中。它可以定位、加载并验证程序所引用的类和接口的字节码。此外,它还可以维护类的运行时完整性,并确保它们符合 JVM 的安全和内存管理规则。
运行时数据区
JVM 将内存划分为各种运行时数据区,例如方法区、堆、栈和程序计数器(PC)寄存器。
- 方法区存储类级结构,如方法字节码、字段信息和常量池数据。
- 堆是一个运行时数据区,JVM 在此为对象动态分配内存空间。所有 Java 线程共享堆内存。
- 程序计数器(PC)寄存器存储当前正在执行的字节码指令的地址。
执行引擎
执行引擎负责运行 Java 字节码。它包含即时(JIT)编译器,该编译器能将频繁执行的字节码动态编译为原生机器码,从而提高性能。
垃圾回收器
垃圾回收器负责管理数据对象的内存分配与回收。它自动识别并释放程序不再引用的对象所占用的内存。
Java 原生接口
Java 原生接口允许 Java 程序与使用 C 或 C++ 等语言编写的原生代码及库进行交互。它使 Java 应用程序能够调用本地方法(反之亦然),从而实现 Java 与现有特定平台功能的无缝集成。
原生方法库
原生方法库包含 Java 应用程序所引用的本地方法的具体实施。这些库在 Java 代码与特定平台功能之间架起了桥梁。原生方法通常用于无法直接以 Java 形式实施的底层操作或依赖于特定系统的任务。
Java 虚拟机中的 JIT 是什么?
JVM 逐行解释字节码,在运行时将每条指令转换为机器码。这种解释执行过程虽然实现了平台无关性,但速度可能慢于原生机器码的执行。JVM 采用即时编译(JIT)技术来提升性能。JIT 编译能显著提高 Java 应用程序的性能。它允许 JVM 针对特定的运行时环境和硬件进行优化。
JIT 的工作原理
JVM 不会解释整个字节码,而是识别频繁运行的代码片段(如循环)或频繁调用的方法(被称为“热点”)。随后,JIT 编译器会有选择地将这些热点代码编译为原生机器码,供 CPU 直接执行。编译后的代码会存储在代码缓存中,以便在后续调用时重复使用。JIT 编译过程涉及多个阶段。
解释
JVM 首先解释字节码,逐行执行。这种方式实现了快速启动,并使 JVM 不受平台影响。
分析
在执行字节码的过程中,JVM 会收集有关代码行为的信息,例如方法调用的频率和所使用的对象类型。这些分析信息有助于识别“热点”。
JIT 编译
根据分析数据,JIT 编译器识别出热点,并有选择地将其编译为原生机器码。编译过程包含多种优化手段,例如内联频繁调用的方法、消除不必要的检查以及优化算术运算。
反优化
由于 JVM 是基于分析数据进行编译的,一旦程序行为发生变化,就会导致代码反优化,并回退到解释执行模式。这确保了执行的正确性,但可能会暂时影响性能。
重新编译
JVM 会持续监控程序的运行情况,并在必要时重新编译热点代码。如果某段原本未优化的代码变成了热点,JVM 就会对其进行编译以提升性能。
JVM、JRE 和 JDK 之间有什么区别?
JVM、JRE 和 JDK 都是 Java 平台的重要组成部分,但它们的用途各不相同。JVM 是执行 Java 字节码的运行时引擎。JRE 和 JDK 是包含 JVM 以及其他工具和库的软件包。
JVM 与JRE
Java 运行时环境(JRE)是一个软件包,其中包含 JVM、Java 类库以及运行 Java 应用程序所需的其他组件。安装 JRE 后,您无需编译或修改代码,即可在系统上运行 Java 应用程序。
JVM 与JDK
Java 开发工具包(JDK)是一个软件包,其中包含 JRE 以及 Java 应用程序开发所需的其他开发工具。JDK 提供编译器、调试器、文档和其他实用工具,供开发人员编写、编译和调试 Java 代码。它是软件开发不可或缺的工具,使程序员能够创建和构建 Java 应用程序。
AWS 如何满足您在 Java 编程语言方面的需求?
适用于 Java 的 AWS SDK 为 Java 开发人员提供了一套一致且熟悉的库,从而简化 AWS 服务的调用过程。它还支持用于简化开发的更高级别的抽象。SDK 代码示例包含 Java 代码示例和 AWS 服务的实际使用案例,可帮助加速您的应用程序开发。此外,Java API 参考指南说明了适用于 Java 的 AWS SDK 最新版的 API 操作。该参考指南提供了针对受支持 Web 服务协议的请求、响应和错误示例。
请参阅开发人员指南或访问 AWS Java 开发人员中心,开始使用适用于 Java 的 AWS SDK。
Browse all cloud computing concepts
Browse all cloud computing concepts content here:
Did you find what you were looking for today?
Let us know so we can improve the quality of the content on our pages