相对于非JIT编译器,JIT编译器具体做什么? 能否简洁易懂地描述一下?
JIT编译器会在程序运行时动态编译字节码为本机代码,从而提高程序的执行效率。而非JIT编译器则会在程序启动时将整个程序的字节码编译为本机代码,这可能会导致启动时间延长。相对于非JIT编译器,JIT编译器具体做什么? 能否简洁易懂地描述一下?
JIT编译器会在程序运行时动态编译字节码为本机代码,从而提高程序的执行效率。而非JIT编译器则会在程序启动时将整个程序的字节码编译为本机代码,这可能会导致启动时间延长。起初,编译器负责将高级语言(定义为比汇编语言更高级的语言)转换为目标代码(机器指令),随后由链接器将其链接成可执行文件。
在语言演变的某个时期,编译器会将高级语言编译成伪代码,然后由解释器解释运行程序。这样消除了目标代码和可执行文件,使得这些语言可以在多个操作系统和硬件平台上移植。 Pascal(编译为P-Code)是最早的一种; Java和C#是较近期的例子。最终,“P-Code”一词被替换为“字节码”,因为大多数伪操作只有一个字节长。
即时编译(JIT)编译器是运行时解释器的一项功能,它不是每次调用方法就解释字节码,而是将字节码编译成运行机器的机器代码指令,然后调用该目标代码。理想情况下,运行目标代码的效率将克服每次运行程序重新编译的低效率。
JIT-即时编译
这个词本身就表明了只在需要时(按需)进行编译。
源代码完全转换为机器代码。
源代码将被转换成类似汇编语言的结构[例如C#的IL(中间语言),Java的字节码]。
当应用程序需要时,中间代码才会被转换成机器语言,也就是仅将所需的代码转换为机器代码。
在JIT中,并非所有代码都被转换为机器代码,而只有必要的部分代码会被转换成机器代码;如果某个方法或功能不在机器代码中,则会被转换为机器代码…… 这减轻了CPU的负担。
由于机器代码将在运行时生成…… JIT编译器将生成针对运行机器CPU架构进行优化的机器代码。
正如其他人所提到的
JIT代表即时编译,这意味着代码在需要时进行编译,而不是在运行时之前。
只是为了补充一下以上讨论的一个观点,在JVM中维护了一个计数器来记录一个函数被执行的次数。如果该计数器超过预定的限制,则JIT将代码编译成机器语言,可直接由处理器执行(与一般情况下javac将代码编译成字节码,然后java解释器逐行解释此字节码并将其转换为机器代码再执行不同)。
此外,在下次计算此函数时,将再次执行相同的编译代码,不像普通解释方式下,代码会再次逐行解释。这使得执行更快。
JIT编译器只在首次执行时将字节码编译为等效的本地代码。在每次后续执行中,JVM仅使用已经编译好的本地代码来优化性能。
没有JIT编译器,JVM解释器会逐行翻译字节码,使其看起来像执行本机应用程序。
JIT代表即时编译,这意味着代码在需要时才被编译而不是在运行时之前。
这是有益的,因为编译器可以为您特定的计算机生成优化的代码。 静态编译器(如普通C编译器)将所有代码编译为开发人员机器上的可执行代码。 因此,编译器将基于某些假设执行优化。 它可能会编译得更慢并进行更多的优化,因为它不会使程序对用户的执行速度变慢。
Intermediate representation JIT Native machine code for the current CPU architecture
Java bytecode ---> machine code
Javascript (run with V8) ---> machine code
即时编译器 (JIT) :
它将 Java 字节码编译成特定 CPU 的机器指令。
例如,如果我们在 Java 代码中有一个循环语句:
while(i<10){
// ...
a=a+i;
// ...
}
我知道这是一个旧的线程,但运行时优化是JIT编译的另一个重要部分,似乎在这里没有被讨论。基本上,JIT编译器可以监视程序运行以确定改进执行的方法。然后,在运行时可以实时进行这些更改。请搜索Google JIT优化(javaworld有一篇相当不错的文章)。