簡體   English   中英

HotSpot JIT內聯策略:自上而下或下至上

[英]HotSpot JIT inlining strategy: top-down or down-top

假設我們有3種方法:從方法1調用方法2,從方法2調用方法3.方法2和3各自大小為30字節碼。 另外,假設確定性方法2總是從方法1中恰好調用一次,並且方法3總是從方法2中調用一次。

如果方法2首先被內聯,則方法3將直接從方法1的主體調用,並且可以依次內聯。 如果方法3首先內聯到方法2中,則后者的大小將變為大約60個字節碼,並且無法內聯,因為默認的MaxInlineSize閾值是35個字節碼。

HotSpot JIT以哪種順序內聯方法:自上而下或下至上?

MaxInlineSize影響至少執行一次但小於MinInliningThreshold次數的方法的編譯。 對於執行超過MinInliningThreshold方法,有一個不同的設置-XX:FreqInlineSize=…具有更大(平台相關)的默認值。 無論MaxInlineSize如何,熱點仍然是內聯的。 您可以通過使用-XX:+UnlockDiagnosticVMOptions運行應用程序來測試它-XX:+UnlockDiagnosticVMOptions -XX:+PrintInlining -XX:MaxInlineSize=0 它仍將報告熱點的內聯(這些與評論“(熱)”)。 只有以前報告為注釋“執行<MinInliningThreshold times”的方法可能會使注釋“太大”。 如果您設置FreqInlineSize您可能會收到“hot method too big”之類的評論。 我從未在默認設置下看到它們。

使用參數運行以下代碼顯示兩個方法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 bytesm235 bytesm331 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++;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM