JVM解释与JIT编译.JVM不编译字节码到可读的机器吗?



我有一个关于JVM(Java虚拟机(和JIT(Just-in-Time(的问题。 据我所知,JVM将一个字节码(来自扩展文件(作为输入.class并解释这个字节码。 问题是:

  1. 当我们说解释时,它的意思是将此字节码转换为机器可读代码(否则编译(?
  2. 那么,如果JVM将字节码"编译"为机器可读代码,而JIT基本上做同样的事情(将字节码转换为机器可读代码(否则编译((,那么使用JIT有什么优势?

谢谢你的回答。

当我们说解释时,它的意思是将此字节码转换为机器可读代码(否则编译(?

不,这意味着口译。想想一个巨大的switch语句打开操作码本身,其中每个案例从字节码中提取所需的操作数(如果有的话(,然后直接执行实现每个操作码所需的代码。例如,考虑iadd

case IADD:
push(pop()+pop());
break;

所以如果JVM将字节码"编译"为机器可读的代码

其实不然。

和JIT

做基本相同的事情(将字节码转换为机器可读代码(否则编译((,使用JIT有什么好处?

首先,术语JIT从Java 1.3开始已经过时。我们现在拥有的是HotSpot JVM,这是一种高度优化的JIT,它有选择地将字节码中的热点转换为机器码,使用通常只有在高度优化的编译器中才能找到的技术,而早期的JIT(a(是第三方产品,(b(它遇到的任何字节码的机器代码都是不分青红皂白的。

其次,解释!=编译,如上所述。如果 HotSpot 注意到字节代码的特定部分正在执行大部分时间,它会将其编译为机器代码,以便它可以直接执行而无需解释。