与非JIT编译器相比,JIT编译器具体做什么?有人能给出简洁易懂的描述吗?


当前回答

非jit编译器获取源代码,并在编译时将其转换为特定于机器的字节代码。JIT编译器获取编译时生成的与机器无关的字节代码,并在运行时将其转换为特定于机器的字节代码。Java使用的JIT编译器允许一个二进制文件无需修改就能在多种平台上运行。

其他回答

JIT编译器在程序启动后运行,并实时(或称为just-in-time)将代码(通常是字节码或某种虚拟机指令)编译为通常更快的形式,通常是主机CPU的本机指令集。JIT可以访问动态运行时信息,而标准编译器不能,并且可以进行更好的优化,例如经常使用的内联函数。

这与传统的编译器相反,传统的编译器在程序第一次运行之前将所有代码编译为机器语言。

换句话说,在你第一次运行程序之前,传统的编译器会将整个程序构建为一个EXE文件。对于新样式的程序,程序集是用伪代码(p-code)生成的。只有在你在操作系统上执行程序之后(例如,通过双击它的图标),(JIT)编译器才会启动并生成基于英特尔处理器或其他能够理解的机器代码(m-code)。

正如其他人提到的

JIT代表Just-in-Time,这意味着代码在需要时才编译,而不是在运行时之前。

为了给上面的讨论补充一点,JVM维护一个函数执行时间的计数。如果该计数超过预定义的限制,JIT将代码编译为处理器可以直接执行的机器语言(不像一般情况下,javac将代码编译为字节码,然后java -解释器逐行解释这个字节码,将其转换为机器代码并执行)。

另外,下次计算此函数时,将再次执行相同的编译代码,而不像常规解释那样逐行重新解释代码。这使得执行速度更快。

代码被编译成某种IL(中间语言)。当你运行你的程序时,计算机不理解这段代码。它只理解本机代码。因此JIT编译器会动态地将IL编译为本地代码。它在方法级别上执行此操作。

我知道这是一个老线程,但是运行时优化是JIT编译的另一个重要部分,这里似乎没有讨论它。基本上,JIT编译器可以在程序运行时监视它,以确定改进执行的方法。然后,它可以在运行时动态地进行这些更改。谷歌JIT优化(javaworld有一篇关于它的很好的文章。)

JIT编译器只在第一次执行时将字节码编译为等效的本机代码。在每次连续执行时,JVM仅使用已编译的本机代码来优化性能。

如果没有JIT编译器,JVM解释器将逐行转换字节码,使其看起来就像正在执行本机应用程序一样。