如果 JIT 正在执行到机器指令的字节码转换,JVM 有什么用

2022-09-01 06:55:50

我真的很难理解下面的事情

以前我知道:

编译Java程序时,将生成文件。在该代码中,代码以字节的形式存在。然后,会将该字节代码转换为机器可理解的格式。.classJVM

现在我在SO中的一个问题中看到了

实时 (JIT) 编译器是运行时解释器的一项功能,它不是在每次调用方法时都解释字节码,而是将字节码编译为正在运行的机器的机器代码指令

所以在这里,JIT正在将字节码转换为机器指令。那么JVM有什么用呢?我们可以通过JIT做到这一点。据我所知,JIT仅用于提高JVM的性能。


答案 1

JIT 只是 JVM 的一部分。其他部分包括字节码解释器,类加载验证和链接机制,以及对反射,I / O等内容的本机代码支持。

从这个意义上说,JIT根本不会让JVM运行得更快。相反,它使Java代码运行得更快...如果JVM只是解释它,它会。

实际上,JVM 确实从解释字节码开始。一段时间后,JVM 然后使用其 JIT 编译器将大量使用的方法编译为本机代码,使用在解释时收集的统计信息来调整手头问题的代码。

顺便说一句,您引用的这部分文本很笨拙,技术上不准确:

实时 (JIT) 编译器是运行时解释器的一项功能...(上下文)

实际上,JIT 不是解释器的功能。相反,JIT是与解释器一起工作的JVM的功能。


答案 2

需要明确的是:

JVM执行所有操作,例如:

它保持在操作系统的顶部,并在编译的java程序和操作系统之间提供抽象。这样,java编译的程序就不必担心它必须在哪个平台上工作。Java程序将代码编译成JVM可以理解和执行的字节码。

断续器

当JVM编译类文件时,它不会完成完整的类文件;它仅根据需要编译其中的一部分。这避免了对完整源代码的大量解析。这种类型的编译称为 JIT 或实时编译。JVM是依赖于平台(OS)的代码生成JIT是面向平台的,生成本机字节码,因此它比JVM更快:)


推荐