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

时间:2010-02-04 21:08:44

标签: java jvm bytecode

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

6 个答案:

答案 0 :(得分:45)

JVM(Java虚拟机)具有与真实机器类似的指令集。给出该指令集的名称是Java Bytecode。它在Java Virtual Machine Specification中描述。其他语言在执行前被转换为字节码,例如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字节码。

答案 1 :(得分:13)

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

JIT指的是JVM在执行程序时动态执行此转换的事实,而不是一步(如传统编译/链接语言,如C或C ++)

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

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

答案 2 :(得分:1)

在Java中编译时,编译器会生成字节码。这是Java虚拟机的本机代码。然后,JVM将字节码转换为处理器/体系结构的本机代码,这就是JIT发生的地方。如果没有JIT,JVM会一次将程序转换为一条指令,这非常慢。

答案 3 :(得分:0)

jcyang已经提供了一个维基百科的链接,但这个链接更符合您的问题:

Java Bytecode

Java Compiler将Java源代码编译为类文件。该类的方法被转换为字节代码,Java虚拟机(JVM)解释此字节代码。可以使用Just In Time编译器(JIT)将字节代码转换为机器代码,以加速类方法的执行。

答案 4 :(得分:0)

字节码是JVM等同于机器语言指令。

答案 5 :(得分:-1)

JVM是一个用于运行Java代码的虚拟机。我们可以将JVM与编译器进行比较,因为没有它我们无法编译Java代码和创建应用程序。 JVM只是一段代码,可以证明你的Java代码。 JVM的主要任务是将Java代码转换为Java字节码并进行编译。这使Java开发变得容易。如果您想了解有关Java虚拟机如何工作的更多信息,请查看incompatible type with javac