JVM和HotSpot
1、概念
JVM是虛擬機的規范,HotSpot是jvm的具體實現
HotSpot包括一個解釋器和兩個編譯器(client 和 server,二選一的),解釋與編譯混合執行模式,默認啟動解釋執行。
編譯器:java源代碼被編譯器編譯成class文件(字節碼),java字節碼在運行時可以被動態編譯(JIT)成本地代碼(前提是解釋與編譯混合執行模式且虛擬機不是剛啟動時)。
解釋器: 解釋器用來解釋class文件(字節碼),java是解釋語言(書上這么說的)。
server啟動慢,占用內存多,執行效率高,適用於服務器端應用;
client啟動快,占用內存小,執行效率沒有server快,默認情況下不進行動態編譯,適用於桌面應用程序。
2.動態編譯
動態編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個意思。
HotSpot對bytecode的編譯不是在程序運行前編譯的,而是在程序運行過程中編譯的。
HotSpot里運行着一個監視器(Profile Monitor),用來監視程序的運行狀況。
java字節碼(class文件)是以解釋的方式被加載到虛擬機中(默認啟動時解釋執行)。 程序運行過程中,那一部分運用頻率大,那些對程序的性能影響重要。對程序運行效率影響大的代碼,稱為熱點(hotspot),HotSpot會把這些熱點動態地編譯成機器碼(native code),同時對機器碼進行優化,從而提高運行效率。對那些較少運行的代碼,HotSpot就不會把他們編譯。
HotSpot對字節碼有三層處理:不編譯(字節碼加載到虛擬機中時的狀態。也就是當虛擬機執行的時候再編譯),編譯(把字節碼編譯成本地代碼。虛擬機執行的時候已經編譯好了,不要再編譯了),編譯並優化(不但把字節碼編譯成本地代碼,而且還進行了優化)。
至於那些程序那些不編譯,那些編譯,那些優化,則是由監視器(Profile Monitor)決定。
3.為什么不靜態編譯那?
為什么字節碼在裝載到虛擬機之前就編譯成本地代碼那?
動態編譯器也在許多方面比靜態編譯器優越。靜態編譯器通常很難准確預知程序運行過程中究竟什么部分最需要優化。
函數調用都是很浪費系統時間的,因為有許多進棧出棧操作。因此有一種優化辦法,就是把原來的函數調用,通過編譯器的編譯,改成非函數調用,把函數代碼直接嵌到調用出,變成順序執行。
面向對象的語言支持多態,靜態編譯無效確定程序調用哪個方法,因為多態是在程序運行中確定調用哪個方法。
Java HotSpot Client VM:為在客戶端環境中減少啟動時間而優化;比較適合桌面程序,它會做一些例如像快速初始化,懶加載這一類的事件來適應桌面程序的特點。
Java HotSpot Server VM:為在服務器環境中最大化程序執行速度而設計; 適合做服務器程序,一些針對服務器特點的事情,比如預加載,尤其在一些並發的處理上,是會做更多的優化。