为什么Java的JIT编译器不能将所有内容转换为本机代码?

时间:2011-08-17 22:36:40

标签: java jvm jit

我一直在研究Java JIT编译器,我无法弄清楚为什么仍然会解释一些代码。为什么JIT编译器不能将所有内容都转换为本机代码?解释要慢得多,我错过了什么?

3 个答案:

答案 0 :(得分:5)

这都是权衡问题

  • 编译+执行代码所需的时间可能比解释一次
  • 的时间长
  • 如果您有关于分支等的统计数据,您通常可以更有效地优化事物
  • 有些东西无法编译(可能是RTTI的任何东西)
  • 您不想编译的一些内容(堆栈跟踪的行号等)
  • 我确定还有其他人。

答案 1 :(得分:3)

如果您正在运行像HotSpot这样的JVM,那么JIT会机会性地编译,只关注经常执行的代码。它通过计算每个代码块的频率(或方法 - 我不确定哪个)来确定要动态优化的代码。因此,在启动时,一切都被解释。

这背后的意图是允许更加激进和昂贵的优化,只需要优化一小部分代码。

答案 2 :(得分:2)

两个主要原因:

  • 如果代码只运行几次,解释速度就会慢一些。单独编译的成本比解释代码要昂贵得多,如果只运行几次。
  • 虽然解释它可以在运行时收集有助于以后优化代码的统计信息。例如,您可以计算特定分支的采用次数,并针对更频繁的情况优化代码以更快。这种技巧可以使JIT编译比提前编译更好(它没有机会利用运行时统计信息)。

因此,Java JIT采取了一种合理的策略:在您观察到多次运行相同的代码之前不要编译,此时您有证据表明编译可能是值得的,并且您可以进行一些额外的操作的优化。