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


当前回答

Jit代表即时编译器 Jit是一个将Java字节代码转换为可以直接发送到处理器的指令的程序。

在特定的系统平台上使用java即时编译器(实际上是第二个编译器)将字节码遵从为特定的系统代码,一旦代码被jit编译器重新编译,它通常会在计算机中运行得更快。

即时编译器随虚拟机一起提供,可选使用。它将字节码编译为立即执行的特定于平台的可执行代码。

其他回答

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

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

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

这是有益的,因为编译器可以生成针对特定机器优化的代码。静态编译器,就像普通的C编译器一样,将所有代码编译为开发人员机器上的可执行代码。因此,编译器将基于一些假设执行优化。它可以编译得更慢,做更多的优化,因为它不会降低用户执行程序的速度。

20%的字节码在80%的时间内被使用。JIT编译器获得这些统计数据,并优化这20%的字节代码,通过添加内联方法、删除未使用的锁等,并创建特定于这台机器的字节码来更快地运行。我引用这篇文章,我发现它很方便。http://java.dzone.com/articles/just-time-compiler-jit-hotspot

Just In Time编译器: 它将java字节码编译成特定CPU的机器指令。

例如,如果我们在java代码中有一个循环语句:

while(i<10){
    // ...
    a=a+i;
    // ...
 }

如果i的值为0,上述循环代码将运行10次。

没有必要一次又一次地编译字节码10次,因为相同的指令将执行10次。在这种情况下,只需要编译该代码一次,并且可以将值更改所需的次数。因此,Just In Time (JIT) Compiler会跟踪这些语句和方法(如上所述),并将这些字节代码片段编译为机器代码以获得更好的性能。

另一个类似的例子是在字符串/句子列表中使用“正则表达式”搜索模式。

JIT Compiler不会将所有代码编译为机器代码。它在运行时编译具有类似模式的代码。

请参阅了解JIT的Oracle文档以了解更多信息。

JIT指的是一些JVM实现中的执行引擎,它更快,但需要更多内存,是一种即时编译器。在此方案中,方法的字节码在第一次调用方法时被编译为本机机器码。然后缓存该方法的本机机器码,以便下次调用相同的方法时可以重用它。