2010-08-01 193 views
3

Java代码被编译为可跨多个平台移植的字节码。 但Java也是JIT编译的,它在飞行中发生。Java代码和JIT编译

这是否意味着Java是编译两次?首先由我们生成字节码,然后由JVM生成第二个字节码? 谢谢。

回答

7

你的代码可能通过字节码,如果它的“辣”的JVM被编译为本地代码;并且可能会多次编译,旧版本将被丢弃,具体取决于程序的运行时特性。

的JIT是一个复杂的野兽;实际上,Sun JVM有两个JIT(-client和-server),它们的行为彼此不同,有些实现甚至支持两个JIT一起运行(因此,您可能已将字节码解释为与由应用程序中的两个不同JIT编译的代码一起运行) 。

我建议你阅读更多关于热点(最常见的JIT,因为它是太阳的),如果你对这个问题很感兴趣。您可以从Sun's page开始。

+0

为什么可以编译多次?为什么第一次编译的字节码不够用? – Chiron 2010-08-01 20:20:49

+2

很多事情可能会导致JIT丢弃旧的编译;事情就像从未采用过的其他分支那样简单,可能会导致JIT发出“错误”并丢弃旧代码(每次都基于同一分支)。 – vanza 2010-08-02 03:00:58

+0

有时它也会编译代码以防万一,即使这个方法没有被执行过。然后,在调用该方法时,它会将其重新编译为更优化的版本。 – 2010-08-02 05:18:19

7

TMK,当您编译您正在编译为JVM平台。然后,当您在任何机器上的JVM上运行应用程序时,经常使用的代码的某些部分会被编译为原始代码为的代码以进行优化。

因此,在短期:是的,但对于一个很好的理由

+0

这是正确的; JVM将进一步将部分代码编译为本地机器代码,以便运行得更快(因为本机机器代码和Java字节代码之间没有更多的抽象)。此运行时编译的行为称为JustInTime(JIT)编译。 – 2010-08-01 19:51:52

+0

所以只有经常使用的代码是JIT编译的? 这是一个新的信息给我,谢谢。 – Chiron 2010-08-01 20:18:03

+1

这可能是更正确的说,字节码*替换*等价的本地代码,而不是*重新编译*。编译通常是比代码替换/优化更复杂的过程。 – 2010-08-01 20:28:21

2

这是否意味着Java是编译两次?我们首先由 生成字节码 ,第二个由JVM生成?谢谢。

可以说,一旦在运行时使用的源代码(编译器)提供的信息,那么其他(JVM/JIT)时有关特定硬件信息可用,一些沿分析来决定什么是JIT编译或不。

1

机制是

爪哇 - >字节码(编译通过Java编译器)

字节代码 - >本地代码(由JVM解释)

0

简短的回答:是的那种。

最长的一个:这是两种不同的东西。 第一次编译是从源代码到字节码,通常在编译字段中调用中间表示(IR)。

然后虚拟机将字节码转换回安装它的平台上的本机代码。

这是2种完全不同的汇编。第二个甚至不是一个汇编,因为没有语法检查器范围分析器......那么有一些检查,但不是在编译器中有同样的检查。