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

Java 我可以强制JVM以本机方式编译给定的方法吗?,java,performance,jit,jvm-arguments,Java,Performance,Jit,Jvm Arguments,我有一个性能关键型方法,在我的应用程序启动时经常调用。最终,它会被JIT编译,但不会在解释器中运行一段明显的时间 有没有什么方法可以告诉JVM,我希望从一开始就编译这个方法(而不需要用-XX:CompileThreshold)之类的东西调整其他内部结构?我不确定它是否会完全预编译代码,但您可以将带有关键方法的类添加到JVM的共享数据转储中。有关更多详细信息,请参阅 还有,你考虑过JNI吗?如果您的方法非常占用CPU,它可能会大大加快速度。我知道的唯一方法是使用-Xcomp标志,但通常不建议使用该

我有一个性能关键型方法,在我的应用程序启动时经常调用。最终,它会被JIT编译,但不会在解释器中运行一段明显的时间


有没有什么方法可以告诉JVM,我希望从一开始就编译这个方法(而不需要用
-XX:CompileThreshold
)之类的东西调整其他内部结构?

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


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

我知道的唯一方法是使用
-Xcomp
标志,但通常不建议使用该标志。它强制所有类和方法在第一次运行时立即进行JIT编译。缺点是在初始启动时会看到性能下降(由于JIT活动增加)。此标志的另一个主要限制是,它似乎禁用了JIT通常会执行的基于增量分析的优化。在标准的混合模式下,JIT编译器可以(也将)根据收集的评测和运行时信息不断地对部分代码进行去优化和重新编译。这使得它能够“纠正”错误的优化,如省略但结果证明是必要的边界检查、次优内联等。
-Xcomp
禁用基于分析的优化,并且根据程序的不同,可能会导致总体性能的显著损失,因为启动过程中只有很小的或没有真正的收益,这就是为什么不建议使用它的原因

除了
-Xcomp
(这相当残忍)和
-XX:CompileThreshold
(它控制JIT在编译/优化之前以intepreted模式运行以收集统计数据的给定方法的执行次数),还有
-Xbatch
。这将强制JIT编译到“前台”,实际上是在编译方法之前阻止对方法的调用,而不是像通常那样在后台编译

您没有指定正在使用的Java版本,但是如果Java 7是您的一个选项,那么它将引入一个名为“分层编译”的新JIT模型(通过
-XX:+tieredcomilation
开关激活)。分层编译的作用是,它允许在第一次使用方法时进行初始的、较小的编译传递,而不是在以后根据收集的分析数据进行额外的、较大的编译/优化。听起来你应该很感兴趣


它可能需要一些额外的调整和参数/配置,但我没有时间进一步检查它。

有趣。不过,这似乎只改进了类加载,而不涉及JIT编译器。还是我遗漏了什么?我想避免JNI,避免在我们部署的所有平台上编译本机代码……你能对该方法运行一个真实的、合成的预热吗?还是它能做一些不可能伪造的事情?这种方法用于在启动后立即解析大型配置文件,这就是我想要加快的。人工热身在这一点上可能不会有什么好处,我想…你能简化一下你的配置吗?将它从xml更改为更简单的属性格式或任何可以减少读取它所需的代码量的内容?也许将配置分为一个“启动”部分,尽可能小,以便启动,以及一个可以在后台加载的主要部分?也许可以将工作并行化,这样即使解释了代码,您也可以从线程化中获得速度?@Jean-philippellet-JIT不会改进您的文件I/O。您是否知道您的方法的执行时间有多少是从文件读取数据,以及实际处理数据的时间有多少?它是解析JSON。第一次解析文件时,大约需要2秒钟。接下来的几次,不到一秒钟。感谢您列出了所有这些选项。太糟糕了,它们不能被设置在更高的级别上……我认为分层编译不会造成太大的损害,因为从长远来看它不会真正改变任何东西。我强烈建议不要使用
-Xcomp
。YMMV,但在我的真实示例中,它的性能比“标准混合模式”差10-30倍。