Learn · concepts

什么是 JVM?Java 虚拟机详解

JVM 可以在任何操作系统上运行 Java 字节码。 这就是为什么 Minecraft Java 版以及所有 Fabric 模组在 Windows、macOS 和 Linux 上都能运行的原因.

TRtrolPublished 1 min read

什么是 JVM?

JVM,即 Java 虚拟机,是运行 Java 代码的程序。你编写 Java 代码,编译器将其转换为字节码,然后 JVM 可以在任何操作系统上运行该字节码。 这就是为什么 Minecraft Java 版及其构建的模组在 Windows、macOS 和 Linux 上表现一致,而无需重新编译的原因。JVM 是将“编写一次,随处运行”从营销口号变成现实的抽象层.

JVM 实际上是如何运作的

JVM 执行的是字节码,而不是源代码。当您编译一个 Java 程序时,您不会得到 Windows 或 Mac 可执行文件。您得到的是包含字节码的类文件,这是一种 JVM 能够理解的紧凑指令集。JVM 读取这些指令并在您的机器上执行它们。

这个额外的层级是关键所在。相同的字节码可以在任何安装了 JVM 的地方运行,因此“编写一次,随处运行”是 Java 如此广泛传播的简短解释。JVM 是使这个承诺成为现实的部分。Fabric 模组的 JAR 文件无论玩家是在 Windows、macOS 还是 Linux 上运行,都能正常工作,因为它们都通过相同的 JVM 运行相同的字节码,而 JVM 处理硬件差异

JVM,JRE,和JDK

这三个术语经常混淆,所以这里进行区分。

术语它是指何时需要
JVM运行字节码的引擎始终,运行任何 Java 程序时
JREJVM 加上标准库运行 Java 程序时
JDKJRE 加上编译器和开发工具构建 Java 程序时

玩家只需要运行时环境来启动游戏。开发模组的开发者需要完整的 JDK,以便首先将 Java 编译成字节码

JVM 如何快速运行你的代码

JVM 首先通过逐条解释字节码开始运行。在运行过程中,它会观察哪些方法被调用得最多。这些热点路径会被交给即时编译器 (JIT),后者会将其在运行时转换为本地机器码。经过预热后,最繁忙的代码可以接近原生速度运行。 这就是为什么…… Minecraft 最初几秒感觉有些卡顿,然后会逐渐稳定下来:JIT 编译器正在后台工作。

JVM 也会为你管理内存。垃圾回收器会回收你不再使用的对象,因此你无需像在 C 语言中那样手动释放内存。这正是 Java 易于编写且是许多模组作者首选语言的原因之一。内存管理是内置的。

为什么这很重要 Minecraft

Minecraft Java 版在 JVM 上运行,所有针对它的工具客户端和模组也是如此。客户端自身的代码可以是 Java、Kotlin 或其他 JVM 语言,因为它们都编译成 JVM 运行的相同字节码 Fabric 模组以字节码罐子的形式存在,加载器在游戏启动时将其连接到游戏中,然后 JVM 以一个进程运行整个内容.

这也是为什么启动器允许你调整诸如堆大小和使用的 Java 版本之类的设置。你正在配置托管游戏的 JVM,而不是游戏本身。为 JVM 分配更多内存意味着 Minecraft 有更大的工作空间。选择更新的 Java 版本可能会给你带来速度提升,因为更新的 JVM 通常能更好地优化热点代码路径。

常见问题