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

问题描述 投票:0回答:4

我一直在研究 Java JIT 编译器,但我无法弄清楚为什么某些代码仍然被解释。为什么 JIT 编译器不将所有内容都翻译为本机代码?翻译速度慢了很多,我错过了什么吗?

java jvm jit
4个回答
5
投票

这都是一个权衡的问题

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

2
投票

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

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


2
投票

两个主要原因:

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

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


0
投票

JIT 编译器使用程序执行统计信息动态优化代码。例如,“热路径”优化对程序某一部分的命中次数进行计数,并仅针对程序中频繁执行的那些部分生成机器代码。这允许 JIT 优化器将频繁执行的机器代码片段放置在一起,以便它们适合处理器的缓存。这使得 JIT 编译器的性能优于预编译的机器代码。

© www.soinside.com 2019 - 2024. All rights reserved.