
1. JVM 概述与工作流程要理解 JVMJava Virtual MachineJava 虚拟机到底解决了什么问题我们需要先退回到计算机最底层的物理现实中。1. 核心矛盾计算机听不懂人类的语言计算机的 CPU中央处理器是一个纯粹的硬件它只认得由0和1组成的指令这被称为机器码Machine Code。不同的操作系统如 Windows、Linux、macOS以及不同的硬件架构它们能识别的机器码规则是完全不同的。Windows 就像一个只懂中文的系统。Linux 就像一个只懂英文的系统。传统语言如 C/C的做法在 Java 诞生之前主流的 C 或 C 语言是这样工作的你写好代码后需要使用一个叫编译器Compiler的工具把代码直接翻译成目标操作系统能听懂的机器码。这就导致了一个巨大的痛点如果你在 Windows 上写了一个优秀的后端程序想要部署到 Linux 服务器上运行你就必须针对 Linux 系统重新编译一次。在这个过程中由于不同系统的底层机制不同代码往往需要做大量的修改。这就是著名的平台依赖问题——换个环境程序就瘫痪了。2. JVM 的解决方案引入“普通话”与“专属翻译官”Java 为了解决这个“到处打补丁”的痛苦提出了一个核心理念一次编写到处运行Write Once, Run Anywhere。为了实现这个目标Java 没有让你的代码直接和操作系统对话而是在中间架设了一个层——这就是JVMJava 虚拟机。整个过程被拆成了两步第一步把 Java 代码换成“中间语言”当你写完一段.java的后端代码后Java 的编译器javac会把你的代码翻译成一种特有的、中立的语言。这种语言叫做字节码Bytecode也就是你编译后看到的.class文件。什么是字节码它不是人类能轻松看懂的高级语言但它也绝对不是操作系统能直接执行的机器码。它是一套只属于 Java 世界的“通用标准语言”你可以把它理解为计算机世界里的“普通话”。第二步让 JVM 充当“专属翻译官”既然操作系统看不懂字节码.class文件那该怎么办这时候JVMJava 虚拟机登场了。虚拟机的意思就是“用软件模拟出来的计算机”。你在 Windows、Linux 或 macOS 上都需要安装对应版本的 JVM。Windows 版的 JVM看得懂字节码并能把它实时翻译成 Windows 懂的机器码。Linux 版的 JVM同样看得懂字节码但它会把它翻译成 Linux 懂的机器码。3. 总结JVM 到底解决了什么问题简单来说JVM 解决了“程序与操作系统之间的耦合问题”。对你开发者而言你只需要学习 Java 语法写出来的.class字节码在任何系统上都是一模一样的。你不需要关心服务器是 Linux 还是 Unix这叫跨平台性。对计算机而言复杂的跨平台转换工作全部由各个系统自带的 JVM 默默背负了。这就好比Java 官方制定了一本通用的“设计图纸”字节码而 JVM 是一个能够看懂图纸并因地制宜完成建造的“施工队”。理解了“跨平台和字节码”的概念之后接下来我们将探讨当你启动一个 Java 程序时JVM 内部是如何分工协作把这套机制运转起来的。