JVM中的JIT编译器究竟是什么?

rib*_*o94 5 java jvm

我试图理解Java源代码是如何执行的,我对JVM内部的JIT编译器实际上是什么感到困惑.首先,让我告诉您我是如何理解从Java源代码到在计算机上执行机器代码的过程.也许,我误解了导致混乱的过程中的某些事情.

步骤:

  1. 源代码被编译成字节码(.class文件)
  2. 类文件被加载到JVM(在RAM中)
  3. 字节码经过验证,然后由JIT编译器处理
  4. JIT编译器的输出是准备好执行的机器代码

现在,根据维基百科关于JVM的文章,更具体地说是"字节码解释器和即时编译器"部分,为了执行Java字节码,你需要一个解释器(但我们有一个JIT 编译器).

现在这里有点困惑我.我把它分成了引号:

"当解释器执行Java字节码时,执行总是比编译成本机机器语言的同一程序的执行慢."

  1. 由于计算机只能执行机器代码,并且解释器在将字节码转换为机器代码方面比编译器慢,为什么JVM使用解释器而不是编译器?

  2. 为什么我们没有为JIT编译器为CPU生成另一个中间可执行文件,以便它可以快速执行指令?

"JIT编译器可以在执行程序时将Java字节码转换为本机机器语言.然后,程序的翻译部分可以比它们解释的更快地执行.这种技术可以应用于经常执行的程序的那些部分."

JIT编译器真的是一个能够编译频繁执行的代码的解释器吗?编译器和解释器这两个术语是否可以互换使用?

提前致谢.

And*_*eas 5

由于计算机只能执行机器代码,并且解释器将字节码转换为机器代码的速度比编译器慢,因此JVM为什么使用解释器而不是编译器?

因为编译到机器代码也需要时间,尤其是在必须分析代码以对其进行优化时,所以解释速度足以在大多数时间执行,并且实际上比仅执行一次/偶尔运行的compile + run要快。

另外,解释器不会“将字节码转换为机器码”。它评估字节码并执行字节码请求的操作。解释器本身是机器代码,但不翻译字节码,而是解释/评估字节码。

为什么我们没有由JIT编译器为CPU生成的另一个中间可执行文件,以便它可以快速执行指令?

这将违反Java的“一次写入,可在任何地方运行”的范例。

JIT编译器真的是可以编译频繁执行的代码的解释器吗?

不,JIT编译器(或更准确地说,是EJP提到的HotSpot编译器)是按需由JVM执行的编译器。

术语“编译器”和“解释器”是否错误地互换使用?

正确。它们不能互换使用,因为它们不会做相同的事情。解释器执行字节码。JIT / HotSpot编译器将字节码转换为机器代码,但不运行它。