有没有办法从JVM内部判断特定方法是否已被JIT编译?

时间:2012-11-17 22:30:28

标签: java performance jvm jit microbenchmark

编写微基准测试时,可以观察到运行时间的巨大差异,具体取决于方法是否已编译。有没有办法从程序中判断是否编译了特定方法?或者,有没有办法要求它,或者知道如何充分地加热它,而没有任何关于例如标志传递给JVM?显然,这不一定是完美的(例如,可能存在导致JVM回退到解释代码的某些条件),但它肯定会有所改进。

2 个答案:

答案 0 :(得分:3)

对于Sun / Oracle JVM,您可以使用-XX:CompileThreshold=1000设置。

这 - 作为official documentation状态 - 定义:

  

编译前的方法调用/分支数

然后,只需使用该数字“预热”JVM。

您还可以将-XX:-PrintCompilation-XX:CompileThreshold一起使用,以便在编译方法时收到通知(在控制台中)。

答案 1 :(得分:1)

我很确定你可以打开方法是JITCed时显示的日志记录。但我不知道从Java中可以说出任何方式。

请记住,JIT编译不是一个事件,而是一个过程 - 一个方法可能会重新编译几次,因为有关其特征的更多信息可用。

最后,请注意,“升温”在一般情况下是不确定的。虽然你通常可以可靠地“预热”单一方法,但由于许多因素,即使是一个适度大的应用程序也会更加困难。

(虽然我不知道为什么无法将某种方法读取某种JITC状态的能力添加到嵌入式调试工具中。)

已添加:在对代码“片段”进行基准测试时要注意的一件事是,执行所有循环的最外层方法通常不支持JITC(取决于JITC是如何进行的)由于它永远不会返回,因此永远无法调用JITCed版本。所以应该总是将代码的“肉”放在一个重复调用的单独方法中,而不是将循环和待基准代码放在同一个方法中。