java分层编译-示例程序中的spike

java分层编译-示例程序中的spike,java,jit,Java,Jit,我试图理解JIT分层编译的一种奇怪行为(-XX:+tieredcomilation) 我的示例程序如下所示: 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();

我试图理解JIT分层编译的一种奇怪行为(-XX:+tieredcomilation)

我的示例程序如下所示:

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);
    }
  }
}
公共类SimpleProgram{
静态最终整块大小=1\u 000;
公共静态void main(字符串[]args){
对于(int i=0;i<500;++i){
long startTime=System.nanoTime();
对于(int j=0;j
我知道这个基准是无效的,
newobject()和整个循环将被JIT删除。这就是这个示例程序的要点

当我执行程序时,我得到的结果是这样的

  • 迭代0-73-35000纳秒
  • 迭代74-252-15000纳秒
  • 迭代253+50纳秒
这正是我想要的,我理解结果

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

具体的迭代过程各不相同,但这个峰值总是存在的。这不应该是第二层编译,因为它将在以后发生。那么是什么导致这个单循环如此之快呢


我在使用不同版本的java/OS/处理器的多台机器上执行此代码时,意外的峰值总是存在。

所谓“峰值”是指运行时的突然下降吗?这与峰值正好相反,运行时间下降,但性能上升。但还是要感谢你从这个角度来看它。@RobertOzga。。。我知道这是一个2年多的老帖子。但是你知道引擎盖下发生了什么吗?我尝试了这段代码,但没有看到峰值(JRE 1.8)。大约在130-150次迭代中,服务器编译器参与其中。当我移动“(%d\t%d%n”,I,endTime-startTime);”对于ArrayList,服务器编译器在第200次迭代时触发。所以CPU时间可能是造成这种情况的原因。