使用参数运行下面的代码表明这两个方法 m3 首先是内联的。我为 jvm 使用了以下参数-XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining
:显然,第一个执行计数达到内联阈值的方法首先被内联。在我们的例子中是 m3。因此,对于我用于测试的热点,m3
在第一次执行和m2
执行结束时是自下而上的。
代码使用 jdk7_u40 运行,禁用了 TieredCompilation,Windows 8 机器上的服务器模式。该命令的输出是:
@ 66 java.lang.String::indexOfSupplementary (71 bytes) too big
@ 21 methodTest::m3 (31 bytes) inline (hot)
@ 11 methodTest::m2 (35 bytes) inline (hot)
@ 21 methodTest::m3 (31 bytes) inline (hot)
@ 14 methodTest::m1 (25 bytes) inline (hot)
@ 11 methodTest::m2 (35 bytes) inline (hot)
@ 21 methodTest::m3 (31 bytes) inline (hot)
m1
是25 bytes
大小,m2
是35 bytes
并且m3
有31 bytes
。
public class methodTest {
public static void main(String[] args) {
doTest();
}
int i = 0;
int j = 0;
int k = 0;
private static void doTest() {
methodTest m = new methodTest();
for (int i = 0; i < 1000000000; i++) {
m.m1();
}
System.out.println(m.i);
System.out.println(m.j);
System.out.println(m.k);
}
private void m1() {
i++;
m2();
j++;
}
private void m2() {
i++;
i++;
m3();
j++;
}
private void m3() {
i++;
j++;
k++;
}
}