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