有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java什么是JVM中的JIT编译器?

我试图理解Java源代码是如何执行的,我对JVM中的JIT编译器实际上是什么感到困惑。首先,让我告诉你我是如何理解从Java源代码到在计算机上执行机器代码的过程的。也许,我在这个过程中误解了一些导致混乱的东西

步骤如下:

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

现在,根据Wikipedia article on JVM,更具体地说是“字节码解释器和即时编译器”部分,为了执行Java字节码,您需要一个解释器(但我们有一个JIT编译器

现在有一点让我困惑。我把它分解成了引语:

“当Java字节码由解释器执行时,执行速度总是比编译成本机语言的同一程序的执行速度慢。”

  1. 既然计算机只能执行机器代码,而且解释器将字节码翻译成机器代码的速度比编译器慢,为什么JVM使用解释器而不是编译器

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

“JIT编译器可以在执行程序时将Java字节码翻译成本机语言。然后,程序的翻译部分可以比解释部分更快地执行。这种技术可以应用于经常执行的程序部分。”

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

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    Since the computer can only execute machine code, and an interpreter is slower at translating the bytecode to machine code than a compiler is, why does the JVM use an interpreter and not a compiler?

    优化编译是一个非常持久的过程。只有当程序运行更长时间时,这种费用才是合理的

    在错误的地方进行优化是不必要的。一段只被遍历一次的代码将消耗比解释更多的编译时间,所以解释是可以的

    这两个主题都可以由编译器更好地处理,如果代码的某些部分被频繁处理,编译器会跳转进来

    Why do we not have another intermediate executable file generated by the JIT compiler for the CPU so it can quickly execute the instructions?

    这个“文件”(编译的片段)确实存在于内存中。它未序列化为文件,因为:

    • 这样的文件将严重依赖于操作系统和硬件
    • 某些代码优化只能在运行时应用,例如,JIT编译器可以优化虚拟调用(用跳转甚至内联代码替换动态分派)

    Is the JIT compiler really an interpreter that has the ability to compile > frequently executed code? Are the terms compiler and interpreter wrongfully used interchangeably?

    虽然JVM热点编译器编译频繁执行的代码,但其他JIT编译器可能会根据其他试探法决定编译。术语“JIT编译器”和“解释器”没有明确区分。大多数解释器进行优化(及时编译),几乎所有JIT编译器都进行解释器