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

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

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会一次将程序转换为一条指令,这非常慢。

Oracle jdk

编译代码,编译后,通过虚拟机而不是计算机处理器运行。 通过使用此方法,源代码可以在编译并在虚拟机中运行后在任何平台上运行。

字节码是Java程序的编译格式。 将Java程序转换为字节码后,可以通过网络传输并由Java虚拟机(JVM)执行。 字节码文件通常具有.class扩展名。

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

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

Java字节码

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

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