java - JVM 解释与 JIT 编译。 JVM 不将字节码编译为机器可读吗?

标签 java compilation jvm jit interpretation

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

  1. 当我们说解释时,是指将字节码翻译为机器可读代码(否则编译)?
  2. 那么,如果 JVM 将字节码“编译”为机器可读代码,而 JIT 执行基本相同的操作(将字节码转换为机器可读代码(否则进行编译)),那么使用 JIT 有何优势?

感谢您的回答。

最佳答案

When we say interpret, it's mean translation this bytecode to machine readable code(otherwise compiling)?

不,这意味着口译。想象一下在操作码本身上切换的巨大 switch 语句,其中每种情况都会从字节码中提取所需的操作数(如果有),然后直接执行实现每个操作码所需的代码。例如,考虑 iadd :

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

So if JVM "compile" bytecode to machine readable code

事实并非如此。

and JIT do basically the same thing (converting bytecode to machine readable code (compiling otherwise)), what the advantages in using JIT?

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

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

关于java - JVM 解释与 JIT 编译。 JVM 不将字节码编译为机器可读吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45427199/

相关文章:

java - 如何使用 Servlet 从 POST 请求获取 JSON 数据

java - 声明 float ,为什么默认类型为 double?

java - 在 UNIX 中运行 Java 时遇到问题

linux - 可以在 Linux 上编译 Windows 代码吗?

memory-management - 为什么即使内存不足且有足够的可用OS内存,JVM也会突然不分配最大的堆设置?

java - Vaadin SuperDevMode 重新编译有时会失败,Widget 未按应有的方式呈现,并且 Widget 的 Java 代码不可用

c - 汇编程序 64 位多重定义错误

c++ - std::cout 功能的特殊行为

java - 抽象类比 Java 中的接口(interface)快吗?

java - 在我的 tomcat pid 上运行 jmap 的说明