我正在尝试理解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删除。这是该示例程序的重点。
当我执行程序时,我得到了类似的结果
这显示我想要的东西,我理解结果。
我不明白的是,每次我在迭代150周围执行这个程序时,记录的时间都是50 ns。
确切的迭代会有所不同,但这种峰值始终存在。这不应该是第二层编译,因为它将在后面发生。那么是什么导致这个单循环如此之快?
我在不同版本的java / OS /处理器的多台机器上执行此代码,并且意外的峰值始终存在。