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

kmd*_*ent 4 java jit jvm

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

Bur*_*ear 5

这都是权衡问题

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


Mar*_*tos 2

如果您正在运行像 HotSpot 这样的 JVM,它会适时进行 JIT 编译,只关注频繁执行的代码。它通过计算每个代码块的频率(或方法 \xe2\x80\x94 我不确定是哪个)来确定要动态优化的代码。因此,在启动时,一切都会被解释。

\n\n

其背后的目的是通过只需要优化一小部分代码来允许更积极和更昂贵的优化。

\n