我对 JIT 编译器感到困惑,
JIT 编译器是一种专门的编译器,它将监视 Java 字节代码的运行,并在必要时将其编译为本机指令。
如果 JIT 确定您的部分代码运行非常频繁,或者将其编译为本机代码将显着提高性能,它就会这样做。
JIT编译是完全可选的,Java的标准实现允许你将其关闭。 然而,确实没有理由将其关闭。
即时 (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 边界条件(例如空指针或数组越界异常)来实现较小的性能提升。 JIT 编译器知道它有空指针异常的唯一方法是通过操作系统发出的信号。由于信号来自操作系统而不是 Java VM,因此您的程序的性能会受到影响。为了确保使用 JIT 运行应用程序时获得最佳性能,请确保您的代码非常干净,没有空指针或数组越界异常等错误。
参考:http://java.sun.com/developer/onlineTraining/Programming/JDCBook/perf2.html
JIT 编译器是 Java 1.1 附带的外部即时编译器。该术语现已过时。 Java 附带了一个内置了编译功能的“HotSpot”JVM。