我可以强制 JVM 以本机方式编译给定的方法吗?
我有一个性能关键型方法,经常在我的应用启动时调用。最终,它得到JIT编译,但不是在解释器中运行一些明显的时间之后。
有没有办法告诉JVM,我希望从一开始就编译此方法(无需使用)之类的东西调整其他内部结构?-XX:CompileThreshold
我有一个性能关键型方法,经常在我的应用启动时调用。最终,它得到JIT编译,但不是在解释器中运行一些明显的时间之后。
有没有办法告诉JVM,我希望从一开始就编译此方法(无需使用)之类的东西调整其他内部结构?-XX:CompileThreshold
我知道的唯一方法是标志,但通常不建议使用。它强制在首次运行所有类和方法时立即对其进行 JIT 编译。缺点是,您将在初始启动时看到性能下降(由于 JIT 活动增加)。此标志的另一个主要限制是它似乎禁用了 JIT 通常执行的基于增量分析的优化。在标准混合模式下,JIT 编译器可以(并且将)根据收集的分析和运行时信息不断取消优化和重新编译部分代码。这允许它“纠正”错误的优化,例如省略但事实证明需要的边界检查,次优内联等。 禁用基于分析的优化,并且根据程序的不同,可能会导致总体性能损失,而启动时只有很小或没有实际收益,这就是不建议使用它的原因。-Xcomp
-Xcomp
除了(这是非常残酷的)和(它控制JIT将在集成模式下运行的给定方法的执行次数,以便在编译/优化之前收集统计信息)之外,还有 。这会强制 JIT 编译处于“前台”,实质上是阻止对方法的调用,直到它被编译完毕,而不是像往常一样在后台编译它。-Xcomp
-XX:CompileThreshold
-Xbatch
您没有指定要使用的 Java 版本,但如果 Java 7 是您的一个选项,它将引入一个名为“分层编译”的新 JIT 模型(使用开关激活)。分层编译的作用是,它允许在首次使用方法时进行初始的较小编译传递,并且比以后基于收集的分析数据进行额外的较大编译/优化。听起来你应该对你感兴趣。-XX:+TieredCompilation
据说它需要一些额外的调整和参数/配置,但我还没有进一步检查它。
我不确定它是否会完全预编译代码,但您可以使用关键方法将类添加到JVM的共享数据转储中。有关更多详细信息,请参阅此问题。
另外,你有没有考虑过JNI?如果您的方法非常占用CPU,它可能会大大加快速度。