JIT编译器和执行

问题描述 投票:0回答:4

我对 JIT 编译器感到困惑,

  1. 什么是 JIT 编译器?
  2. JIT 编译器在每次执行之前或每次 JVM 加载时编译字节码?
java jit
4个回答
5
投票

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

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

请参阅即时编译HotSpot(维基百科)了解更多详细信息。


1
投票

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

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

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


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 边界条件(例如空指针或数组越界异常)来实现较小的性能提升。 JIT 编译器知道它有空指针异常的唯一方法是通过操作系统发出的信号。由于信号来自操作系统而不是 Java VM,因此您的程序的性能会受到影响。为了确保使用 JIT 运行应用程序时获得最佳性能,请确保您的代码非常干净,没有空指针或数组越界异常等错误。

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


0
投票

JIT 编译器是 Java 1.1 附带的外部即时编译器。该术语现已过时。 Java 附带了一个内置了编译功能的“HotSpot”JVM。

© www.soinside.com 2019 - 2024. All rights reserved.