13

3 つのメソッドがあるとします。メソッド 2 はメソッド 1 から呼び出され、メソッド 3 はメソッド 2 から呼び出されます。メソッド 2 と 3 のサイズはそれぞれ 30 バイトコードです。また、明確にするために、メソッド 2 は常にメソッド 1 から 1 回だけ呼び出され、メソッド 3 は常にメソッド 2 から 1 回だけ呼び出されるとします。

メソッド 2 が最初にインライン化されると、メソッド 3 がメソッド 1 の本体から直接呼び出され、順番にインライン化される可能性があります。MaxInlineSize方法 3 を先に方法 2 にインライン化すると、後者のサイズは約 60 バイトコードになり、デフォルトのしきい値が 35 バイトコードであるため、インライン化できませんでした。

HotSpot JIT がメソッドをインライン化する順序: トップダウンまたはダウントップ?

4

2 に答える 2

3

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

m125 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++;
    }
}
于 2013-09-11T11:51:11.270 に答える