JIT编译器和执行

时间:2010-06-23 16:58:44

标签: java compiler-construction jit

我对JIT编译器感到困惑,

  1. 什么是JIT编译器?
  2. JIT编译器在每次执行之前或每次加载JVM时编译字节代码?

4 个答案:

答案 0 :(得分:4)

JIT代表“及时”。它是一个编译器,可以在程序运行时将Java字节码转换为本机机器代码。

每次运行Java程序时,Sun的JIT都不会预先编译所有字节码;它包含一些非常复杂的逻辑来决定何时编译部分字节码,它使用的标准之一是代码执行的频率。

有关详细信息,请参阅Just-in-time compilationHotSpot(维基百科)。

答案 1 :(得分:1)

JIT编译器是一个专门的编译器,它将监视Java再见代码运行并在必要时将其编译为本机指令。

如果JIT确定您的代码的一部分频繁运行,或者将其编译为本机代码将显着提高性能,那么它将会这样做。

JIT编译是完全可选的,Java的标准实现允许您将其关闭。但是,没有理由将其关闭。

答案 2 :(得分:1)

实时(JIT)编译器是一个程序,它将Java字节码(包含必须解释的指令的程序)转换为可以直接发送到处理器的指令。

JIT编译器作为独立的平台相关本机库提供。如果存在JIT编译器库,则Java VM初始化Java本机接口(JNI)本机代码挂钩以调用该库中可用的JIT函数,而不是解释器中的等效函数.java.lang.Compiler类用于加载本机库并在JIT编译器内启动初始化.JIT编译器使用自己的调用程序。 Sun生产版本检查值ACC_MACHINE_COMPILED的方法访问位,以通知解释器此方法的代码已经编译并存储在已加载的类中。当第一次调用方法时(依赖于JVM供应商),JIT编译器编译方法阻塞到此方法的本机代码中,并将其存储在该方法的代码块中。

编译代码后,将设置在Sun平台上使用的ACC_MACHINE_COMPILED位。

首先要记住的是,JIT编译器在第二次(取决于JVM供应商)调用方法时实现了大部分速度提升。 JIT编译器确实编译整个方法,而不是逐行解释它,这也可以在运行启用了JIT的应用程序时获得性能提升。这意味着如果只调用一次代码,您将看不到显着的性能提升。 JIT编译器也忽略了类构造函数,因此如果可能的话,将构造函数代码保持在最低限度。

JIT编译器还通过不预先检查某些Java边界条件(如Null指针或数组超出范围的异常)来实现较小的性能提升。 JIT编译器知道它具有空指针异常的唯一方法是由操作系统引发的信号。由于信号来自操作系统而不是Java VM,因此您的程序会受到性能影响。为了确保在使用JIT运行应用程序时获得最佳性能,请确保您的代码非常干净,没有Null指针或数组超出范围异常等错误。

参考:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html

答案 3 :(得分:0)

JIT编译器是Java 1.1附带的外部即时编译器。这个词现在已经过时了。 Java附带了一个内置编译的“HotSpot”JVM。