1. HotSpot歷史
SUN的JDK版本從1.3.1開始運用HotSpot虛擬機, 2006年底開源,主要使用C++實現,JNI接口部分用C實現。
HotSpot是較新的Java虛擬機,用來代替JIT(Just in Time),可以大大提高Java運行的性能。
Java原先是把源代碼編譯爲字節碼在虛擬機執行,這樣執行速度較慢。而HotSpot將常用的部分代碼編譯爲本地(原生,native)代碼,這樣顯着提高了性能。
HotSpot JVM 參數可以分爲規則參數(standard options)和非規則參數(non-standard options)。
規則參數相對穩定,在JDK未來的版本里不會有太大的改動。
非規則參數則有因升級JDK而改動的可能。
2.HotSpot基礎知識
HotSpot包括一個解釋器和兩個編譯器(client 和 server,二選一的),解釋與編譯混合執行模式,默認啓動解釋執行。
編譯器:java源代碼被編譯器編譯成class文件(字節碼),java字節碼在運行時可以被動態編譯(JIT)成本地代碼(前提是解釋與編譯混合執行模式且虛擬機不是剛啓動時)。
解釋器: 解釋器用來解釋class文件(字節碼),java是解釋語言(書上這麼說的)。
server啓動慢,佔用內存多,執行效率高,適用於服務器端應用;
client啓動快,佔用內存小,執行效率沒有server快,默認情況下不進行動態編譯,適用於桌面應用程序。
由-XX:+RewriteFrequentPairs參數控制 client模式默認關閉,server模式默認開啓
在jre安裝目錄下的lib/i386/jvm.cfg 文件下。
3.動態編譯
動態編譯(compile during run-time),英文稱Dynamic compilation;Just In Time也是這個意思。
HotSpot對bytecode的編譯不是在程序運行前編譯的,而是在程序運行過程中編譯的。
HotSpot裏運行着一個監視器(Profile Monitor),用來監視程序的運行狀況。
java字節碼(class文件)是以解釋的方式被加載到虛擬機中(默認啓動時解釋執行)。 程序運行過程中,那一部分運用頻率大,那些對程序的性能影響重要。對程序運行效率影響大的代碼,稱爲熱點(hotspot),HotSpot會把這些熱點動態地編譯成機器碼(native code),同時對機器碼進行優化,從而提高運行效率。對那些較少運行的代碼,HotSpot就不會把他們編譯。
HotSpot對字節碼有三層處理:不編譯(字節碼加載到虛擬機中時的狀態。也就是當虛擬機執行的時候再編譯),編譯(把字節碼編譯成本地代碼。虛擬機執行的時候已經編譯好了,不要再編譯了),編譯並優化(不但把字節碼編譯成本地代碼,而且還進行了優化)。
至於那些程序那些不編譯,那些編譯,那些優化,則是由監視器(Profile Monitor)決定。
最後歡迎大家訪問我的個人網站:1024s