使用 JIT 的优化是否只发生一次,并且永久保留或仅在运行的生命周期内保留



我正在阅读有关Just-in-time compilers的不同文章,其中提到JIT将代码片段(热点)优化为直接本机代码(机器代码)。我的问题是每次我运行.class file时都会发生这种优化吗?另一方面,传统的compiled代码是一劳永逸地优化的,而不仅仅是在一个execution(例如)期间。

这种hot-spot optimizationmachine中"记住"在哪里?

这可能取决于 JRE 实现,但通常每次启动程序时都会重做 JIT 优化。除此之外,热点环境可能会根据运行时分析更改其优化,并实际处理输入数据。

是的,这与传统编译的语言非常不同。

需要注意的一点是:部分因为它取决于输入,因此无法保证热点 JIT 每次都会以相同的方式优化代码。这使得尝试手动优化Java代码变得更加困难。您确实需要进行完整的配置文件分析,并且需要在扩展执行和完整范围的输入数据上执行此操作,否则您可能会自欺欺人。我看到在同一台计算机上对相同输入运行相同代码的机器有 20% 的性能变化,显然是因为 JIT 以不同的顺序进行了优化,并且遇到了它愿意生成多少本机代码的限制。

JIT 编译器生成仅存在于 JVM 进程的工作内存中的工件。即使在同一个过程中,由于一个乐观的假设或其他假设无效,相同的代码也经常被重新编译。

请注意,JIT 编译可能(在 HotSpot 上)比静态编译更激进——主要是由于上述乐观假设,静态编译的代码无法承受。

即时翻译仅在程序运行期间存在。当程序终止时,JIT 指令消失了(但它们可能会在下次执行期间重新生成 - 这取决于"热"路径)。

最新更新