小编典典

我可以强制JVM本地编译给定方法吗?

java

当我的应用启动时,我经常调用一种性能至关重要的方法。最终,它会被JIT编译,但是不会在解释器中运行一些明显的时间之后编译。

有什么办法可以告诉JVM我想从一开始就编译该方法(而无需使用诸如的东西来调整其他内部结构-XX:CompileThreshold)?


阅读 215

收藏
2020-11-13

共1个答案

小编典典

我知道的唯一方法是-Xcomp标志,但是通常不建议使用该标志。它会在第一次运行所有类和方法时强制立即进行JIT编译。缺点是,由于启动JIT活动增加,您将看到性能在初始启动时下降。此标志的另一个主要限制是,它似乎禁用了JIT通常会执行的基于增量分析的优化。在标准混合模式下,JIT编译器可以(并且将)基于概要分析和所收集的运行时信息来连续地对代码的某些部分进行优化和重新编译。这使它可以“纠正”错误的优化,例如省略但事实证明是必需的边界检查,次优内联等。-Xcomp
禁用基于性能分析的优化,并且取决于程序,可能会导致整体性能显着下降,而启动时仅获得很小的收获或没有真正的收获,这就是为什么不建议使用它的原因。

除了-Xcomp(这非常残酷)和-XX:CompileThreshold(控制JIT将以解释模式运行多少给定方法以在编译/优化它之前收集统计信息)之外,还有-Xbatch。这迫使JIT编译进入“前景”,本质上阻止了对方法的调用,直到它被编译为止,而不是像通常那样在后台编译它。

您没有指定要使用哪个Java版本,但是如果可以选择使用Java
7,它将引入一个新的JIT模型,称为“分层编译”(通过-XX:+TieredCompilation开关激活)。分层编译的作用是,基于收集的性能分析数据,它允许在首次使用方法时进行初始的较小编译,然后在以后进行其他较大的编译/优化。听起来您应该很感兴趣。

据说它需要一些额外的调整和参数/配置,但是我还没有进一步检查它。

2020-11-13