1. JVM 概述与工作流程

要理解 JVM(Java Virtual Machine,Java 虚拟机)到底解决了什么问题,我们需要先退回到计算机最底层的物理现实中。

1. 核心矛盾:计算机听不懂人类的语言

计算机的 CPU(中央处理器)是一个纯粹的硬件,它只认得由 01 组成的指令,这被称为机器码(Machine Code)

不同的操作系统(如 Windows、Linux、macOS)以及不同的硬件架构,它们能识别的机器码规则是完全不同的。

  • Windows 就像一个只懂中文的系统。
  • Linux 就像一个只懂英文的系统。

传统语言(如 C/C++)的做法

在 Java 诞生之前,主流的 C 或 C++ 语言是这样工作的:

你写好代码后,需要使用一个叫编译器(Compiler)的工具,把代码直接翻译成目标操作系统能听懂的机器码。

这就导致了一个巨大的痛点:如果你在 Windows 上写了一个优秀的后端程序,想要部署到 Linux 服务器上运行,你就必须针对 Linux 系统重新编译一次。在这个过程中,由于不同系统的底层机制不同,代码往往需要做大量的修改。

这就是著名的平台依赖问题——换个环境,程序就瘫痪了。

2. JVM 的解决方案:引入“普通话”与“专属翻译官”

Java 为了解决这个“到处打补丁”的痛苦,提出了一个核心理念:一次编写,到处运行(Write Once, Run Anywhere)

为了实现这个目标,Java 没有让你的代码直接和操作系统对话,而是在中间架设了一个层——这就是 JVM(Java 虚拟机)

整个过程被拆成了两步:

第一步:把 Java 代码换成“中间语言”

当你写完一段 .java 的后端代码后,Java 的编译器(javac)会把你的代码翻译成一种特有的、中立的语言。

这种语言叫做字节码(Bytecode),也就是你编译后看到的 .class 文件。

什么是字节码?

它不是人类能轻松看懂的高级语言,但它也绝对不是操作系统能直接执行的机器码。它是一套只属于 Java 世界的“通用标准语言”(你可以把它理解为计算机世界里的“普通话”)。

第二步:让 JVM 充当“专属翻译官”

既然操作系统看不懂字节码(.class 文件),那该怎么办?

这时候,JVM(Java 虚拟机)登场了。虚拟机的意思就是“用软件模拟出来的计算机”。你在 Windows、Linux 或 macOS 上,都需要安装对应版本的 JVM。

  • Windows 版的 JVM:看得懂字节码,并能把它实时翻译成 Windows 懂的机器码。
  • Linux 版的 JVM:同样看得懂字节码,但它会把它翻译成 Linux 懂的机器码。

3. 总结:JVM 到底解决了什么问题?

简单来说,JVM 解决了“程序与操作系统之间的耦合问题”。

  • 对你(开发者)而言:你只需要学习 Java 语法,写出来的 .class 字节码在任何系统上都是一模一样的。你不需要关心服务器是 Linux 还是 Unix,这叫跨平台性
  • 对计算机而言:复杂的跨平台转换工作,全部由各个系统自带的 JVM 默默背负了。

这就好比,Java 官方制定了一本通用的“设计图纸”(字节码),而 JVM 是一个能够看懂图纸并因地制宜完成建造的“施工队”。

理解了“跨平台和字节码”的概念之后,接下来我们将探讨当你启动一个 Java 程序时,JVM 内部是如何分工协作把这套机制运转起来的。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐