我多次听说Java实现了JIT(just-in-time)编译,并且它的跨平台可移植字节码被JVM“解释”。但是,我并不真正了解字节码是什么,以及JVM在Java语言体系结构中的实际含义;我想了解更多关于它们的信息。
发布于 2010-02-04 21:37:19
JVM (Java Virtual machine,Java虚拟机)具有与真实机器一样的指令集。该指令集的名称是Java字节码。在Java Virtual Machine Specification中对其进行了描述。其他语言在执行前被翻译成字节码,例如ruby和python。Java的字节码处于相当低的级别,而python的字节码处于更高的级别。
解释和JIT编译是执行字节码的两种不同策略。解释一次处理一个字节码,对每条指令中编码的虚拟机状态进行更改。JIT编译将字节码翻译成执行等价操作的主机平台原生指令。
解释通常启动得很快,但在执行过程中很慢,而JIT有更多的启动开销,但之后运行得更快。现代JVM使用解释和JIT技术的组合来获得两者的好处。字节码首先被解释,而JIT在后台翻译它。一旦JIT编译完成,JVM就会切换到使用该代码而不是解释器。有时,即时编译可以产生比用于C和C++的提前编译更好的结果,因为它更具动态性。JVM可以跟踪代码被调用的频率以及通过代码的典型路径,并在程序运行时使用此信息生成更有效的代码。JVM可以切换到这个新代码,就像它最初从解释器切换到JIT代码一样。
就像其他语言可以编译成本机代码一样,比如C、C++、Fortran;也有其他语言的编译器可以输出JVM字节码。scala语言就是一个例子。我相信groovy和jruby也可以转换成java字节码。
发布于 2010-02-04 21:19:04
字节码是介于源代码和实际机器代码之间的一步。JVM获取字节码并将其转换为机器码。
JIT指的是这样一个事实,即当程序执行时,JVM动态地进行这种转换,而不是在单个步骤中(就像在传统的编译/链接语言中,如C或C++)。
字节码的要点是,与严格解释的语言(例如PHP )相比,您可以获得更好的性能,因为字节码已经部分编译和优化。此外,由于字节码不需要由CPU直接解释,因此它不需要绑定到任何特定的CPU体系结构,从而使其更具可移植性。
当然,缺点是它通常会比本地编译的应用程序慢一点,因为JVM在将字节码转换为机器码时仍然需要做一些工作。
发布于 2010-02-04 21:19:43
当你用Java编译一些东西时,编译器会生成字节码。这是Java虚拟机的本机代码。然后,JVM将字节码转换为适合您的处理器/体系结构的本机代码,这就是JIT发生的地方。如果没有JIT,JVM将一次翻译一条指令,这是非常慢的。
https://stackoverflow.com/questions/2203248
复制相似问题