【问题标题】:JVM interpretation vs JIT compilation. Does JVM not compile bytecode to machie readable? [duplicate]JVM 解释与 JIT 编译。 JVM不会将字节码编译为机器可读吗? [复制]
【发布时间】:2017-08-01 00:30:04
【问题描述】:

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

  1. 当我们说解释的时候,意思是把这个字节码翻译成机器可读的代码(否则编译)?
  2. 那么,如果 JVM 将字节码“编译”为机器可读代码和 JIT 做的事情基本相同(将字节码转换为机器可读代码(否则编译)),那么使用 JIT 有什么优势?

感谢您的回答。

【问题讨论】:

标签: java compilation jvm jit interpretation


【解决方案1】:

当我们说解释的时候,意思是把这个字节码翻译成机器可读的代码(否则编译)?

不,这意味着解释。想象一个巨大的 switch 语句在操作码本身上进行切换,其中每个案例都会从字节码中提取所需的操作数,然后直接执行实现每个操作码所需的代码。例如,考虑iadd

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

如果 JVM “编译”字节码为机器可读代码

没有。

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

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

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

【讨论】:

  • 所以当你说“每个案例都从字节码中提取所需的操作数,然后直接执行实现每个操作码所需的代码。”JVM 如何执行?我虽然 JVM 应该与硬件或底层操作系统通信。谢谢。
  • 它只是运行代码,和你一样。函数调用、系统调用、循环、赋值等等。你知道它是代码本身,它已经与硬件和操作系统进行通信。这里没有谜团。
  • 据我所知,每个平台都有专门为它编写的JVM。另一方面,我们有可以在平台之间传输的唯一字节码。这个事实是否意味着 JVM 应该将字节码转换为机器可读的代码?例如 134 (0x86) i2f 在 Java 平台内部转换操作码。我很难理解。需要重新阅读或深入了解该主题。
  • 不,不是这个意思。我已经解释了所有这些,并举了一个例子。见编辑。
猜你喜欢
  • 2017-06-09
  • 1970-01-01
  • 2016-05-24
  • 2010-12-31
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多