我一直在研究 Java JIT 编译器,但我无法弄清楚为什么某些代码仍然被解释。为什么 JIT 编译器不将所有内容都翻译为本机代码?翻译速度慢了很多,我错过了什么吗?
这都是一个权衡的问题
如果您正在运行像 HotSpot 这样的 JVM,它会机会性地进行 JIT 编译,只关注频繁执行的代码。它通过计算每个代码块(或方法 - 我不确定是哪个)的频率来确定要动态优化哪些代码。因此,在启动时,一切都会被解释。
其背后的目的是通过只需要优化一小部分代码来实现更积极和更昂贵的优化。
两个主要原因:
因此,Java JIT 采用了一个明智的策略:在观察到相同的代码多次运行之前不要进行编译,此时您有证据表明进行编译可能是值得的,并且您可以进行一些额外的优化。
JIT 编译器使用程序执行统计信息动态优化代码。例如,“热路径”优化对程序某一部分的命中次数进行计数,并仅针对程序中频繁执行的那些部分生成机器代码。这允许 JIT 优化器将频繁执行的机器代码片段放置在一起,以便它们适合处理器的缓存。这使得 JIT 编译器的性能优于预编译的机器代码。