java tieredcompilation - 示例程序中的spike

时间:2017-02-05 19:10:59

标签: java jit

我正在尝试理解JIT分层编译的奇怪行为(-XX:+ TieredCompilation)。

我的示例程序如下所示:

public class SimpleProgram {
  static final int CHUNK_SIZE = 1_000;

  public static void main(String[] args) {
    for ( int i = 0; i < 500; ++i ) {
      long startTime = System.nanoTime();

      for ( int j = 0; j < CHUNK_SIZE; ++j ) {
        new Object();
      }

      long endTime = System.nanoTime();
      System.out.printf("%d\t%d%n", i, endTime - startTime);
    }
  }
}

我知道这个基准测试无效,整个循环的new Object();将被JIT删除。这是该示例程序的重点。

当我执行程序时,我得到了类似的结果

  • 迭代0-73 - 35000 ns
  • 迭代74-252 - 15000 ns
  • 迭代253 + 50 ns

这显示我想要的东西,我理解结果。

我不明白的是,每次我在迭代150周围执行这个程序时,记录的时间都是50 ns。

确切的迭代会有所不同,但这种峰值始终存在。这不应该是第二层编译,因为它将在后面发生。那么是什么导致这个单循环如此之快?

我在不同版本的java / OS /处理器的多台机器上执行此代码,并且意外的峰值始终存在。

0 个答案:

没有答案