当前位置: 首页 > 知识库问答 >
问题:

JVM解释与JIT编译。JVM不会将字节码编译成机器可读的吗?[副本]

章博耘
2023-03-14

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

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

谢谢你的回答。

共有1个答案

南宫泓
2023-03-14

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

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

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

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

事实并非如此。

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

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

第二,解释!=汇编,如上所述。若HotSpot注意到一段特定的字节码在很大一部分时间内被执行,它将把它编译成机器码,这样它就可以直接执行而无需解释。

 类似资料:
  • 请注意,我的问题是关于JVM解释器,而不是JIT编译器。JIT编译器将java字节码转换为本机代码。因此,这必须意味着JVM中的解释器不会将字节码转换为机器码。因此,问题是:从本质上讲,口译员做什么?如果有人能帮我用一个简单的字节码示例来回答这个问题,相当于1 1=2,即解释器在执行这个加法操作时做了什么?(我的隐含问题是,如果解释器不翻译为机器代码,那么哪个CPU执行添加操作,那么该操作是如何执

  • 我知道这依赖于JVM,每个虚拟机都会选择实现它,但我想了解总体概念。 据说对于JVM用来执行Java程序的内存段 Java堆栈 不一定用连续内存实现,并且可能都实际分配在操作系统提供的一些堆内存上,这就引出了我的问题。 完全使用JIT机制并将字节码方法编译为本机机器码方法的JVM将这些方法存储在某个地方,那会在哪里?执行引擎(通常用C/C编写)将不得不调用这些JIT编译函数,然而内核不应该允许程序

  • 问题内容: 我遇到了一些有关JVM / JIT活动的参考,其中似乎在编译字节码和解释字节码之间有区别。该特定注释声明的字节码在前10000次运行时进行解释,然后进行编译。 “编译”和“解释”字节码之间有什么区别? 问题答案: 解释字节码基本上是逐行读取字节码,不进行任何优化或任何操作,然后对其进行解析并实时执行。由于许多原因,这种方法效率低下,其中包括Java字节码设计得不能快速解释的问题。 编译

  • 问题内容: 我对JVM有一个非常基本的问题:它是编译器还是解释器? 如果它是解释器,那么JVM内部存在的JIT编译器怎么办? 如果两者都不是,那么JVM到底是什么?(我不希望将字节码转换为机器特定的代码等jVM的基本定义。) 问题答案: 首先,让我们对以下术语有一个清晰的认识 是Java编译器-将Java代码编译为 Bytecode 是Java虚拟机-运行/解释/将字节码转换为本 机代码 是即时编

  • 问题内容: 有什么方法可以对Java即时编译器生成的本机代码进行汇编转储吗? 和一个相关的问题:是否有任何方法可以使用JIT编译器而无需运行JVM将我的代码编译为本地机器代码? 问题答案: 是的,有一种方法可以打印生成的本机代码(需要OpenJDK 7)。 不,无法使用JDK的JIT将Java字节码编译为本地代码并将其另存为本地可执行文件。 即使这是可能的,它也可能没有您想象的有用。JVM进行了一

  • 问题内容: Sun的规范JVM实现对字节码进行了一些相当复杂的优化,以在代码运行几次后获得接近本机的执行速度。 问题是,为什么没有将此编译后的代码缓存到磁盘以供以后使用同一功能/类时使用? 就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用代码的预编译版本。当本质上解释字节码时,是否添加此功能不会大大提高程序的初始运行时间? 问题答案: 我不求助于@MYYN发布的链接的’n’past