Java虛擬機(一):JVM簡介


JVM簡介

Java虛擬機(JVM)是由Java虛擬機規范定義的,其上運行的是字節碼指令集。這種字節碼指令集包含一個字節的操作碼(opcode),零至多個操作數(oprand),虛擬機規范明確定義了每種字節碼指令完成的功能是什么以及需要多少個操作數。Java虛擬機上運行的class文件,這個文件中包含字節碼指令流以及類定義的信息,所以Java虛擬機規范還定義了class文件的格式(精確到每個字節)。所以實現Java虛擬機的兩個要素是字節碼指令集和class文件格式,Java虛擬機的實現者只要以正確方式讀取class文件中的每一條字節碼指令,並按照要求實現字節碼指令的功能就可以實現JVM。

目前常用的商用JVM主要有:Sun HotSpot,BEA JRocket以及IBM J9。其中由於BEA和Sun已經被Oracle收購,所以Oracle擁有當今世界上最流行的兩個JVM,並有傳言說Oracle將在Java8時將兩個虛擬機合並,各取所需,取長補短,打造一個更加精湛的JVM。HotSpot會以解釋+即時編譯執行代碼,HotSpot在解釋執行字節碼的時候,會探測熱點(hotspot)代碼,然后將這部分代碼編譯為本地代碼,之后將直接運行本地代碼,而不是解釋,這樣會有效提高虛擬機性能。JRocket主要是定位於服務器應用,所以不關注虛擬機的啟動速度,它會將所有代碼即時編譯為本地代碼執行,JRocket的垃圾收集器具有很高的收集效率。J9定位與HotSpot類似,專注於桌面應用和服務器應用,主要是針對IBM的各種Java產品。

我們知道Java源代碼,即.java文件,通過javac編譯為.class文件。.class文件可以運行在JVM上,JVM底層會通過字節碼解釋器或者即時編譯器(JIT Compiler)執行.class文件中的字節碼指令。JVM是運行在操作系統之上的,操作系統又通過指令集調用底層硬件服務執行其上的各種軟件。
 
Java是運行在JVM之上的。但是Java語言和JVM沒有必然的聯系。Java語言並不是只能運行在JVM之上,只要實現了相應的編譯器Java語言就可以運行在任何平台之上(比如J++),也可以被編譯為本地代碼直接運行在操作系統之上,比如,Linux上的GCJ(GNU Compiler for Java)就可以把Java語言編譯為本地代碼直接執行。同樣的,JVM上也不是只能執行Java語言,只要實現了適當的編譯器,將其他語言編譯為JVM上的字節碼,就可以在JVM上運行。比如,JRuby,Jython以及Groovy等其他JVM語言,都會通過相應的編譯器或是解釋器轉化為.class,然后再JVM上運行。由於JVM並不關心.class文件是由Java、JRuby、Jython等轉化而來,只要這個文件結構正確並能通過class文件校驗。因此,由於.class文件屏蔽了Java、JRuby等上層語言的差異,所以Java、Groovy等可以相互調用。
 

JVM種類

目前常用的商用JVM主要有:Sun HotSpot,BEA JRocket以及IBM J9。

Sun HotSpot

提起HotSpot VM,相信所有Java程序員都知道,它是Sun JDK和OpenJDK中所帶的虛擬機,也是目前使用范圍最廣的Java虛擬機。

HotSpot VM的熱點代碼探測能力可以通過執行計數器找出最具有編譯價值的代碼,然后通知JIT編譯器以方法為單位進行編譯。
如果一個方法被頻繁調用,或方法中有效循環次數很多,將會分別觸發標准編譯和OSR(棧上替換)編譯動作。
通過編譯器與解釋器恰當地協同工作,可以在最優化的程序響應時間與最佳執行性能中取得平衡,而且無須等待本地代碼輸出才能執行程序,
即時編譯的時間壓力也相對減小,這樣有助於引入更多的代碼優化技術,輸出質量更高的本地代碼。

在2006年的JavaOne大會上,Sun公司宣布最終會把Java開源,並在隨后的一年,陸續將JDK的各個部分(其中當然也包括了HotSpot VM)在GPL協議下公開了源碼,
並在此基礎上建立了OpenJDK。這樣,HotSpot VM便成為了Sun JDK和OpenJDK兩個實現極度接近的JDK項目的共同虛擬機。

在2008年和2009年,Oracle公司分別收購了BEA公司和Sun公司,這樣Oracle就同時擁有了兩款優秀的Java虛擬機:JRockit VM和HotSpot VM。
Oracle公司宣布在不久的將來(大約應在發布JDK 8的時候)會完成這兩款虛擬機的整合工作,使之優勢互補。
整合的方式大致上是在HotSpot的基礎上,移植JRockit的優秀特性,譬如使用JRockit的垃圾回收器與MissionControl服務,
使用HotSpot的JIT編譯器與混合的運行時系統。

BEA JRocket

BEA JRockit 旨在驅動要求極高的服務器端 Java 應用,以便為企業應用提供極高的性能、可管理性和可靠性。Oracle JRockit (原來的 Bea JRockit)系列產品是一個全面的Java運行時解決方案組合,包括了行業最快的標准Java解決方案。 大量的行業基准測試顯示,基本JRockit JVM是世界上最快的JVM。JRockit面向延遲敏感型應用的解決方案JRockit Real Time提供以毫秒或微秒級的JVM響應時間,適合財務前端辦公、軍事指揮與控制和電信網絡的需要。使用JRockit產品,客戶已經體驗到了顯著的性能提高(一些超過了70% )和硬件成本的減少(達50%)。JRocket主要是定位於服務器應用,所以不關注虛擬機的啟動速度,它會將所有代碼即時編譯為本地代碼執行,JRocket的垃圾收集器具有很高的收集效率。

IBM J9

J9與JRockit類似,亮點是高度模塊化,不但可以部署在桌面或服務器上,還可以部署到嵌入式環境中,例如CLDC級別的環境;這些環境用的是同一個J9核心VM,搭配上適用於具體環境的GC和JIT編譯器。IBM J9包含整套解決方案,后期維護相對會比較方便。

 

 


作者:朝雨憶輕塵

出處:https://www.cnblogs.com/xifengxiaoma/ 

版權所有,歡迎轉載,轉載請注明原文作者及出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM