我有一个性能关键的方法,在我的应用程序启动时经常被调用。最终,它会被JIT编译,但在解释器中运行一段时间后才会被编译。
有没有办法告诉JVM,我想从一开始就编译这个方法(而不是通过调整其他内部参数,如-XX:CompileThreshold)?
有没有办法告诉JVM,我想从一开始就编译这个方法(而不是通过调整其他内部参数,如-XX:CompileThreshold)?
-Xcomp
标志,但通常不建议使用。它会强制立即对所有类和方法进行JIT编译第一次运行时。缺点是您将在初始启动时看到性能下降(由于增加了JIT活动)。此标志的另一个主要限制是,它似乎禁用了JIT通常执行的基于增量分析的优化。在标准混合模式下,JIT编译器可以(并且将)根据收集的分析和运行时信息不断地取消优化和重新编译代码的部分。这使它能够“纠正”省略的边界检查、次优内联等错误优化。 -Xcomp
禁用了基于分析的优化,并且根据程序的不同,可能会导致总体性能损失相当大,而仅获得很小或没有真正的启动收益,因此不建议使用。-Xcomp
和控制JIT在解释模式下编译/优化给定方法执行多少次以收集统计数据的-XX:CompileThreshold
之外,还有-Xbatch
。这会将JIT编译强制为“前台”,基本上阻止对方法的调用,直到它被编译,而不是像通常那样在后台编译。
您没有说明使用哪个Java版本,但如果Java 7是您的选择,它引入了一种名为“分层编译”的新JIT模型(通过-XX:+TieredCompilation
开关激活)。分层编译的作用是允许在第一次使用方法时进行初始的小型编译传递,然后根据收集的分析数据稍后进行额外的较大的编译/优化。听起来应该很有趣。
据说它需要一些额外的调整和参数/配置,但我还没有进一步检查它。