在java中,當編譯器將源代碼轉(zhuǎn)化為字節(jié)碼時,會對源代碼進行相應的優(yōu)化操作辱揭,具體可以總結(jié)為以下幾點
tips:泛型與類擦除
java中的泛型是只存在于源代碼中的品洛,在已經(jīng)編譯后的字節(jié)碼文件里叭莫,已經(jīng)替換為了原來的原生類型,并在相應的地方擦除了強制轉(zhuǎn)換代碼经宏,在運行中ArrayList與ArrayList是同一個類犀暑,盡管在源代碼中是不同的泛型
1對常量的操作
(1)如果一個表達式E已經(jīng)被計算過,而且從先前到現(xiàn)在E中的值沒有變化烁兰,E會成為公共表達式并且不會再次計算耐亏,直接調(diào)用之前的結(jié)果。
(2)String +常量表達
String a = "a"+"b";
String b = "a"+1;
會被自動優(yōu)化成
String a ="ab";
Strng b ="a1";
(3)常量替換
final int N =1;
int n=N;
會變成
int N =1;
int n =1;
(4)某些常量計算也會直接算出
int n = 1+1;
會變成
int n =2;
(5)確定的結(jié)果也會折疊
boolean f = true||(a&&b||c);
會變成
boolean f =true;
2.數(shù)組邊界檢查消除
如果在一段關(guān)于數(shù)組的操作中沪斟,明顯可以確定操作不會越界的話广辰,編譯器會把多余的數(shù)組越界的檢查操作給除掉。
3 逃逸分析
如果一個方法被定下以后主之,它可能被外部方法給引用择吊,則被稱為方法逃逸,被外部線程訪問訪問到則被稱為線程逃逸
槽奕,如果可以確定一個方法不會發(fā)生方法逃逸或者線程逃逸几睛,編譯器會試著通過棧上分配、同步消除粤攒、標量替換等手段優(yōu)化所森,盡量使得其中使用的局部對象在棧上方法結(jié)束后就被銷毀。