Jea*_*let 30 java performance jit jvm-arguments
当我的应用启动时,我经常调用一个性能关键的方法.最终,它被JIT编译,但是在解释器中运行了一些明显的时间之后.
有什么办法我可以告诉JVM我想从一开始就编译这个方法(没有调整其他内部的东西-XX:CompileThreshold)?
pap*_*pap 38
我知道的唯一方法是-Xcomp标志,但通常不建议使用.它会在第一次运行时强制立即对所有类和方法进行JIT编译.缺点是您会在初始启动时看到性能下降(由于JIT活动增加).此标志的另一个主要限制是它似乎禁用JIT通常会执行的基于增量分析的优化.在标准混合模式下,JIT编译器可以(并将)根据收集的分析和运行时信息不断地优化和重新编译部分代码.这允许它"纠正"错误的优化,例如被省略但被证明是需要的边界检查,次优内联等.-Xcomp禁用基于分析的优化并且取决于程序,可能仅在很小的情况下导致显着的性能损失.在启动时没有真正的收获,这就是为什么不建议使用它.
除了-Xcomp(这是非常残酷的)和-XX:CompileThreshold(它控制给定方法的执行次数,JIT将在编译/优化它之前以解释模式运行以收集统计数据),还有-Xbatch.这迫使JIT编译到"前台",基本上阻止对方法的调用,直到它被编译,而不是像往常一样在后台编译它.
您没有指定您正在使用的Java版本,但如果Java 7是您的选项,它会引入一个名为"Tiered compilation"的新JIT模型(通过-XX:+TieredCompilation交换机激活).分层编译的作用是,它允许在第一次使用方法时进行初始的,较小的编译传递,而不是基于收集的分析数据进行额外的,更大的编译/优化.听起来应该对你有意思.
据说它需要一些额外的调整和参数/配置,但我还没有进一步检查它.