パラメータを指定して以下のコードを実行すると、両方のメソッド 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++;
}
}