什么是字节码以及 JVM 如何处理它们

2022-09-01 21:49:31

我多次听说Java意味着JIT(即时)编译,其跨平台可移植的字节码被JVM“解释”。但是,我真的不知道字节码是什么,以及JVM在Java语言架构中的实际含义是什么;我想更多地了解他们。


答案 1

JVM(Java虚拟机)有一个指令集,就像一个真正的机器一样。为此指令集指定的名称是 Java 字节码。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字节码。


答案 2

字节码是源代码和实际机器代码之间的一个步骤。JVM是获取字节码并将其转换为机器代码的东西。

JIT是指JVM在执行程序时动态执行此转换,而不是在单个步骤中(如C或C++等传统编译/链接语言)

字节码的要点是,与严格解释的语言(例如PHP)相比,您可以获得更好的性能,因为字节码已经过部分编译和优化。此外,由于字节码不需要由CPU直接解释,因此它不需要绑定到任何特定的CPU架构,这使得它更具可移植性。

当然,缺点是它通常比本机编译的应用程序慢一些,因为JVM仍然需要做一些工作,将字节码转换为机器代码。


推荐