是什么泣矛?
Java在執(zhí)行過程中包含解釋器和編譯器(JVM規(guī)范并沒有規(guī)定必須包含編譯器疲眷,但是通常會作為一個評判JVM好壞的標準);
解釋器:將class文件解析執(zhí)行您朽;
編譯器:將class文件編譯成為字節(jié)碼狂丝,提高底層執(zhí)行效率;
JIT內(nèi)置了兩個即時編譯器C1(Client)和C2(Server)哗总,兩個工作模式不太一樣几颜,默認會根據(jù)機器硬件來進行選擇,但是也可以通過手工配置(-client或-server)讯屈;
為了達到啟動響應(yīng)時間和運行效率的平衡蛋哭,出現(xiàn)了分層編譯:
0層:沒有編譯;
1層:C1編譯涮母,將字節(jié)碼編譯為本地代碼谆趾;
2層:C2編譯,將字節(jié)碼編譯為本地代碼哈蝇,同時加入一些優(yōu)化和性能監(jiān)控棺妓;
編譯誰?
熱點代碼
熱點代碼怎么檢測炮赦?
- 計數(shù)
- 采樣
- 蹤跡
計數(shù)熱點代碼統(tǒng)計
方法調(diào)用計數(shù)器(Client 1500次怜跑,Server 10000次),計數(shù)器不僅會增加吠勘,還會衰減性芬;
回邊計數(shù)器,執(zhí)行到"}"才計數(shù)(Client 13995剧防,Server 10700次)植锉;
編譯過程
同步編譯:編譯完成后才返回執(zhí)行結(jié)果
異步編譯:后臺編譯;
兩種不同編譯器
- Client Compiler:關(guān)注局部性能優(yōu)化峭拘,過程(class->高級中間代碼->低級中間代碼->機器代碼)俊庇;
- Server Compiler:關(guān)注全局,會優(yōu)化鸡挠,比較慢