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

当我的应用程序启动时,我经常调用一个性能关键的方法。 最终,它被JIT编译,但是在解释器中运行了一些明显的时间之后。

有没有什么办法可以告诉JVM我想从一开始就编译这个方法(没有用-XX:CompileThreshold类的东西调整其他内部-XX:CompileThreshold )?

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

除了-Xcomp (这是非常残酷的)和-XX:CompileThreshold (它控制JIT将在编译/优化它之前在解释模式下运行以获取统计数据的给定方法的执行次数),还有-Xbatch 。 这会强制JIT编译到“前台”,基本上阻止对方法的调用,直到它被编译,而不是像往常一样在后台编译它。

您没有指定您正在使用的Java版本,但如果Java 7是您的选项,它会引入一个名为“Tiered compilation”的新JIT模型(使用-XX:+TieredCompilation开关激活)。 分层编译的作用是,它允许在第一次使用方法时进行初始的,较小的编译传递,而不是基于收集的分析数据进行额外的,更大的编译/优化。 听起来应该对你有意思。

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

我不确定它是否会完全预编译代码,但是您可以使用关键方法将您的类添加到JVM的共享数据转储中。 有关详细信息,请参阅此问题 。

还有,你考虑过JNI吗? 如果你的方法非常占用CPU,那么它可能会大大加快速度。