为什么最初解释为机器代码的所有java字节码都没有?

时间:2013-04-06 19:35:48

标签: jvm interpreter java bytecode

我读到了Just-in-time compilation (JIT),据我所知,有两种方法 - Interpreter和JIT,它们都在运行时解释bytecode

为什么不准备将所有字节码解释为机器代码,然后才开始运行该过程而不再需要解释器?

3 个答案:

答案 0 :(得分:6)

JIT编译后期的另一个原因与优化有关:在运行时,VM可以检测到它可能优化的更多/其他模式,而不是编译器在编译时可以做的。启动时JIT预编译总是必须是静态的,编译器已经完成了相同的操作,但通过分析实际运行时行为,VM可能有更多关于可能的信息优化,因此可能产生更好的优化结果。

例如,VM可以检测到单个代码在运行时实际运行了一百万次并执行了编译器可能没有任何信息的适当优化,这与现代运行时完成的分支预测不同。的CPU。
更多信息可以在"Adaptive optimization"上的维基百科文章中找到。

答案 1 :(得分:4)

简单:因为将所有内容预编译到机器代码需要时间。并且用户不希望等待应用程序启动。请记住,预编译必须进行大量优化,这需要时间。

JVM的服务器版本在预编译和优化代码方面更加积极,因为服务器端的代码往往会在流程关闭之前更频繁地执行并持续更长的时间。

然而,一个名为NGen的应用程序是一个名为NGen的应用程序,它预先进行预编译,以便在此之后不需要它。你只需要运行一次。

并非所有VM都包含解释器。例如,Chrome和CLR(.Net)在运行之前总是编译为机器代码。但是,它们具有多个级别的优化以减少启动时间。

答案 2 :(得分:0)

我发现link显示了运行时重新编译如何优化性能并节省额外的CPU周期。

  • 内联扩展:降低程序调用的成本。
  • 删除冗余负载:当2个编译代码导致某些重复代码时,可以通过在运行时重新编译来删除它并进一步优化。
  • 复制传播
  • 消除死码

这是另一个link,用于上面给出的相同解释。