早期(編譯期)優(yōu)化
java泛型
在java中,泛型方法在編譯之后,生成的class文件里面保存的是原生類(lèi)型。
晚期(運(yùn)行期)優(yōu)化
java程序最初是通過(guò)解釋器進(jìn)行解釋執(zhí)行的,當(dāng)某個(gè)方法或者代碼塊的運(yùn)行特別頻繁時(shí),就會(huì)將這些代碼認(rèn)定為熱點(diǎn)代碼。為了提高這些熱點(diǎn)代碼的執(zhí)行效率,在運(yùn)行時(shí)侯會(huì)將這些代碼編譯為和平臺(tái)無(wú)關(guān)的機(jī)器碼,并進(jìn)行各種層次的優(yōu)化,完成這個(gè)任務(wù)的編輯器被稱(chēng)為即時(shí)編譯器
11.2HotSpot虛擬機(jī)內(nèi)的即時(shí)編輯器
解釋器與編譯器
解釋器:迅速啟動(dòng)和執(zhí)行
編譯器:將代碼轉(zhuǎn)化為本地代碼,獲取更高的執(zhí)行效率
HotSpot虛擬機(jī)里面內(nèi)置兩個(gè)即時(shí)編譯器,分別稱(chēng)為Client Compiler和Server Compiler
11.2.2編譯對(duì)象和觸發(fā)條件,在上文當(dāng)中已經(jīng)提到會(huì)被即時(shí)編譯器編譯的“熱點(diǎn)代碼主要分為兩類(lèi)”1,被多次調(diào)用的方法。2.被多次執(zhí)行的循環(huán)體
判斷一段代碼是不是熱點(diǎn)代碼,是不是需要觸發(fā)即時(shí)編譯,這樣的行為稱(chēng)為熱點(diǎn)探測(cè),主要由兩種:
1,基于采樣的熱點(diǎn)探測(cè):周期性的檢查虛擬機(jī)的棧頂,若一個(gè)或者某些方法經(jīng)常出現(xiàn)在棧頂
2,基于計(jì)數(shù)器的熱點(diǎn)探測(cè):建立計(jì)數(shù)器,設(shè)置閥值。
而Hotpost主要采用的時(shí)第二種--因此它為每個(gè)方法準(zhǔn)備了兩種計(jì)數(shù)器:方法調(diào)用計(jì)數(shù)器(client是1500次,server模式下是10000次)和回邊計(jì)數(shù)器(他的作用是統(tǒng)計(jì)一個(gè)方法當(dāng)中循環(huán)體代碼執(zhí)行的次數(shù))