Java虛擬機(JVM)JIT優化

在本章中,我們將介紹JIT優化。

方法內聯

在這種優化技術中,編譯器決定用函數體替換函數調用。以下是實現相同功能的例子 -

int sum3;

static int add(int a, int b) {
   return a + b;
}

public static void main(String…args) {
   sum3 = add(5,7) + add(4,2);
}

//after method inlining
public static void main(String…args) {
   sum3 = 5+ 7 + 4 + 2;
}

使用這種技術,編譯器可以節省機器進行任何函數調用的開銷(它需要將參數推送和彈出到棧)。因此,生成的代碼運行得更快。

方法內聯只能用於非虛函數(未被覆蓋的函數)。考慮如果add方法在子類中被覆蓋會發生什麼,並且在運行時之前不知道包含該方法的對象的類型。在這種情況下,編譯器不知道要內聯的方法。但是如果方法標記為final,那麼編譯器很容易知道它可以是內聯的,因為它不能被任何子類覆蓋。請注意,並不是都保證final方法始終是內聯的。

無法訪問和死代碼消除

無法訪問的代碼是任何可能的執行流都無法訪問的代碼。考慮以下示例 -

void foo() {
   if (a) return;
   else return;
   foobar(a,b); //unreachable code, compile time error
}

死代碼也是無法訪問的代碼,但編譯器確實在這種情況下吐出錯誤。相反,只是得到一個警告。每個代碼塊(例如構造函數,函數,trycatchifwhile等)都有自己的規則,用於在JLS(Java語言規範)中定義的無法訪問的代碼。

常量折疊

要瞭解常量折疊概念,請參閱以下示例:

final int num = 5;
int b = num * 6; //compile-time constant, num never changes
//compiler would assign b a value of 30.

上一篇: Java虛擬機(JVM)32b與64b 下一篇: Java虛擬機(JVM)垃圾收集