我正在阅读Just-in-time compilers
上的不同文章,并提到JIT
将代码片段(热点)优化为直接本机代码(机器代码)。我的问题是
每次运行.class file
时都会发生这种优化。另一方面,传统的compiled
代码会一次性优化,而不仅仅在一个execution
期间(例如)。
这种hot-spot optimization
"在哪里记得"在machine
?
答案 0 :(得分:4)
这可能取决于JRE的实现,但通常每次启动程序时都会重做JIT优化。除此之外,热点环境可以基于运行时分析来更改其优化,并且实际处理输入数据。
是的,这与传统编译的语言非常不同。
需要注意的一点是:部分因为它取决于输入,所以无法保证热点JIT每次都会以相同的方式优化代码。这使得尝试手动优化Java代码更加困难。您确实需要进行完整的配置文件分析,并且需要通过扩展执行和完整的输入数据来完成,否则您可能会欺骗自己。我在相同的机器上看到相同的代码在相同的输入上有20%的性能变化,显然是因为JIT以不同的顺序进行了优化,并且限制了它愿意生成多少本机代码。
答案 1 :(得分:2)
JIT编译器生成仅存在于JVM进程的工作内存中的工件。即使在同一个过程中,由于一个乐观的假设或其他已经失效的相同代码经常被重新编译。
请注意,JIT编译可以(并且在HotSpot上, )比静态编译更具攻击性 - 主要是由于上面提到的静态编译代码无法承受的乐观假设。 / p>
答案 2 :(得分:1)
Just-In-Time翻译仅在程序运行期间存在。当程序终止时,JIT指令消失了(但它们可能在下次执行时重新生成 - 它取决于“热”路径)。