JIT编译器和执行

3
我对JIT编译器感到困惑,
  1. 什么是JIT编译器?
  2. JIT编译器是在每次执行或每次JVM加载之前编译字节码吗?
4个回答

5
JIT代表“即时编译器”。当您的程序运行时,它将Java字节码转换为本机机器代码的编译器。
Sun的JIT不会在每次运行Java程序时预先编译所有字节码;它包含一些非常复杂的逻辑来决定何时编译字节码的部分,其中一个标准是代码执行的频率。
有关更多详细信息,请参见就地编译HotSpot(维基百科)。

1
JIT编译器是一种专门的编译器,它会监视Java字节码运行,并在必要时将其编译成本地指令。
如果JIT确定您的代码的某个部分非常频繁地运行,或者将其编译为本地代码将显着提高性能,它将这样做。
JIT编译是完全可选的,Java的标准实现允许您关闭它。然而,没有真正的理由关闭它。

这是否意味着JIT编译是可选的? - Isabel Jinson
是的,它是可选的,因为你可以关闭它;但是,默认情况下它是开启的(这是一件好事)。 - Edwin Buck
在Sun的Java实现中,您可以使用命令行选项“-Xint”关闭JIT编译,但通常情况下您不会这样做。 - Jesper

1

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

JIT编译器作为独立的平台相关本机库提供。如果存在JIT编译器库,Java VM会初始化Java Native Interface(JNI)本机代码钩子,以调用该库中可用的JIT函数而不是解释器中等效的函数。java.lang.Compiler类用于加载本机库并在JIT编译器内启动初始化。JIT编译器使用自己的调用程序。Sun产品发布会检查ACC_MACHINE_COMPILED值的方法访问位,以通知解释器该方法的代码已经被编译并存储在已加载的类中。当首次调用方法时(取决于JVM供应商),JIT编译器会将方法块编译为本机代码,并将其存储在该方法的代码块中。

一旦代码已编译,Sun平台上使用的ACC_MACHINE_COMPILED位被设置。

首先要记住的是,JIT编译器在第二次(取决于JVM供应商)调用方法时实现了大部分速度提升。 JIT编译器会编译整个方法而不是逐行解释它,这也可以提高运行启用JIT的应用程序的性能。这意味着如果代码只被调用一次,您将看不到显著的性能提升。 JIT编译器还忽略类构造函数,因此如果可能,请将构造函数代码最小化。
JIT编译器通过不预先检查某些Java边界条件(如空指针或数组越界异常)来实现轻微的性能提升。 JIT编译器知道它有一个空指针异常的唯一方法是通过操作系统发出的信号。由于信号来自操作系统而不是Java VM,因此您的程序会受到性能影响。为确保在运行启用JIT的应用程序时获得最佳性能,请确保您的代码非常干净,没有像空指针或数组越界异常等错误。
参考:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html

0

JIT编译器是随Java 1.1一起提供的外部即时编译器。该术语现在已经过时。Java现在配备了一个内置编译功能的“HotSpot”JVM。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接