compilation - time编译 - jvm jit




即时(JIT)编译器的功能是什么? (12)

80%的时间使用了20%的字节码。 JIT编译器获取这些统计信息并优化这20%的字节码,以通过添加内联方法,去除未使用的锁等来创建特定于该机器的字节码,从而加快运行速度。 我从这篇文章引用,我发现它很方便。 http://java.dzone.com/articles/just-time-compiler-jit-hotspot

与非JIT编译器相比,JIT编译器具体做什么? 有人能给出一个简洁而易于理解的描述吗?


JIT-就在这个词本身就说明什么时候需要(按需)

典型场景:

源代码完全转换为机器码

JIT场景:

源代码将被转换为汇编语言,如结构[用于C#的ex IL(中间语言),用于java的ByteCode]。

只有当应用程序需要时,中间代码才被转换为机器语言,所需的代码仅被转换为机器代码。

JIT与非JIT比较:

  • 在JIT中,并不是所有的代码都先转换成机器代码,然后将必要的代码的一部分转换成机器代码,然后如果调用的某个方法或功能不在机器中,那么它就会变成机器代码......它会减少CPU的负担。

  • 由于机器码将在运行时生成.... JIT编译器将生成针对运行机器CPU架构而优化的机器码。

JIT示例:

  1. 在Java中JIT在JVM(Java虚拟机)
  2. 在C#中它是在CLR(公共语言运行时)
  3. 在Android中,它在DVM(Dalvik虚拟机)中,或ART(Android RunTime)中的更新版本中。

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


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

这与在程序首次运行之前所有代码编译为机器语言的传统编译器形成对比。

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


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

在特定的系统平台上使用Java即时编译器(真正的第二个编译器)将字节码合并到特定的系统代码中,一旦代码由jit编译器重新编译,它通常会在计算机中更快地运行。

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


即时编译器(JIT):
它将java字节码编译成特定CPU的机器指令。

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

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

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

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

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

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

有关了解JIT的更多信息,请参阅此Oracle文档


你有编译成一些IL(中间语言)的代码。 当您运行程序时,计算机不理解此代码。 它只理解本地代码。 所以JIT编译器可以将你的IL编译成本地代码。 它在方法级别执行此操作。


出于性能原因,JVM实际上在运行时执行编译步骤。 这意味着Java没有一个干净的编译执行分离。 它首先执行从Java源代码到字节码的所谓静态编译。 然后这个字节码被传递给JVM执行。 但是执行字节码很慢,因此JVM测量字节码运行的频率,以及何时检测到运行频率很高的代码“热点”,它会执行从字节码到“热点”代码(热点分析器)的机器码的动态编译。 今天的Java程序如此有效地通过机器码执行来运行。


在Java编译器生成字节码(这是架构中立的)之后,执行将由JVM处理(使用Java)。 字节码将由加载程序加载到JVM,然后解释每个字节指令。

当我们需要多次调用某个方法时,我们需要多次解释相同的代码,这可能需要比所需时间更长的时间。 所以我们有JIT(即时)编译器。 当字节被加载到JVM(它的运行时间)时,整个代码将被编译而不是被解释,从而节省时间。

JIT编译器仅在运行时工作,所以我们没有任何二进制输出。


开始时,编译器负责将高级语言(定义为比汇编程序更高的级别)转换为目标代码(机器指令),然后将其链接(通过链接器)为可执行文件。

在语言发展的一个阶段,编译器会将高级语言编译为伪代码,然后解释器(解释器)将其解释为运行程序。 这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台。 Pascal(编译成P-Code)是第一个; Java和C#是最近的例子。 最终术语P-Code被替换为字节码,因为大多数伪操作都是一个字节长。

准时制(JIT)编译器是运行时解释程序的一项功能,它不是每次调用某个方法时都解释字节码,而是将字节码编译为正在运行的机器的机器代码指令,然后调用此目标代码。 理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的低效率。


正如其他人所提到的

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

只是为上面的讨论添加一个观点,JVM维护一个函数执行多少次的计数。 如果这个计数超过了预定义的限制JIT将代码编译为可以直接由处理器执行的机器语言(不同于javac将代码编译为字节码然后编译为java的正常情况 - 解释器逐行解释此字节代码将其转换为机器代码并执行)。

下一次计算该函数时,将再次执行相同的编译代码,而不像正常的解释那样,代码被逐行解释。 这使得执行速度更快。


非JIT编译器会在编译时采用源代码并将其转换为机器特定的字节码。 JIT编译器会在编译时生成机器不可知的字节码,并在运行时将其转换为机器特定的字节码。 Java使用的JIT编译器允许单个二进制文件在多个平台上运行而无需修改。