我多次听说 Java 实现了 JIT(即时)编译,其可跨平台移植的字节码被 JVM “解释”。但是,我真的不知道字节码是什么,以及 JVM 在 Java 语言体系结构中的实际含义;我想更多地了解他们。
6 回答
JVM(Java 虚拟机)有一个指令集,就像一台真机一样。该指令集的名称是 Java Bytecode。它在Java 虚拟机规范中有所描述。其他语言在执行前会被翻译成字节码,例如 ruby 和 python。Java 的字节码处于相当低的级别,而 python 的字节码则更高。
解释和 JIT 编译是执行字节码的两种不同策略。解释一次处理一个字节码,对每条指令中编码的虚拟机状态进行更改。JIT 编译将字节码翻译成主机平台的本机指令,执行等效操作。
解释通常启动很快,但在执行过程中很慢,而 JIT 的启动开销更大,但之后运行得更快。现代 JVM 使用解释和 JIT 技术的组合来获得两者的好处。当 JIT 在后台翻译字节码时,首先解释字节码。一旦 JIT 编译完成,JVM 就会切换到使用该代码而不是解释器。有时 JIT 编译可以产生比用于 C 和 C++ 的提前编译更好的结果,因为它更具动态性。JVM 可以跟踪代码被调用的频率以及通过代码的典型路径是什么,并使用这些信息在程序运行时生成更高效的代码。JVM 可以切换到这个新代码,就像它最初从解释器切换到 JIT 代码一样。
就像有其他可以编译为本机代码的语言一样,例如 C、C++、Fortran;有其他语言的编译器可以输出 JVM 字节码。一个例子是 scala 语言。相信groovy和jruby也可以转换成java字节码。
字节码是您的源代码和实际机器代码之间的一个步骤。JVM 接收字节码并将其转换为机器码。
JIT 指的是 JVM 在程序执行时即时执行此翻译,而不是一步完成(如在 C 或 C++ 等传统编译/链接语言中)
字节码的意义在于你可以获得比严格解释的语言(例如 PHP)更好的性能,因为字节码已经部分编译和优化。此外,由于字节码不需要由 CPU 直接解释,因此它不需要绑定到任何特定的 CPU 架构,这使得它更具可移植性。
当然,缺点是它通常会比本地编译的应用程序慢一点,因为 JVM 仍然需要做一些工作来将字节码转换为机器码。
当你用 Java 编译某些东西时,编译器会生成字节码。这是 Java 虚拟机的本机代码。然后,JVM 将字节码转换为处理器/架构的本机代码,这就是 JIT 发生的地方。如果没有 JIT,JVM 将一次翻译一条指令,这非常慢。
字节码是机器语言指令的 JVM 等价物。
jcyang 已经提供了维基百科的链接,但这个更适合您的问题:
Java 编译器将 Java 源代码编译为类文件。类的方法被翻译成字节码,Java 虚拟机 (JVM) 解释这个字节码。即时编译器 (JIT) 可用于将字节码转换为机器码以加速类方法的执行。
JVM是用于运行Java代码的虚拟机。我们可以将 JVM 与编译器进行比较,因为没有它我们无法编译 Java 代码并制作应用程序。JVM 只不过是一段可以证明您的 Java 代码的代码。JVM的主要任务是将Java代码转换成Java字节码并编译。这使得 Java 开发变得容易。如果您想了解有关 Java 虚拟机如何工作的更多信息,请查看这篇文章?