JVM系列.歷史上出現過的Java虛擬機
HotSpot絕對是當今商用虛擬機的王者,但是在Java歷史上出現過很多Java虛擬機,這篇文章就來整理下歷史上出現過的Java虛擬機以及他們的特性。
Sun Classic
Sun Classic虛擬機是JDK 1.0默認的虛擬機。但是這個虛擬機不帶即時編譯技術,性能稍差。Classic虛擬機在JDK 1.2之前是JDK中唯一的虛擬機,在JDK 1.2時,它與HotSpot VM並存,但默認是使用ClassicVM(用戶可用java-hotspot參數切換至HotSpot VM),而在JDK 1.3時,HotSpot
成為默認虛擬機,它仍作為虛擬機的「備用選擇」發布(使用java-classic參數切換),直到JDK 1.4的時候,Classic VM才完全退出商用虛擬機的歷史舞台,進入了Sun LabsResearch VM之中。
可以說Sun Classic虛擬機是Java商用虛擬機的鼻祖。
HotSpot VM
相信所有Java程式設計師都聽說過HotSpot虛擬機,它是Sun/OracleJDK和OpenJDK中的默認Java虛擬機,也是目前使用範圍最廣的Java虛擬機。
HotSpot虛擬機是Sun公司收購的項目,具有現代虛擬機的高級特性,比如它的名字中所說的:熱點程式碼探測技術。
Mobile/Embedded VM
專門針對移動設備或者嵌入式設備的虛擬機。
JRockit和IBM J9
BEA System公司的JRockit,BEA公司後來被Oracle公司收購,JRockit虛擬機也不再繼續發展。
IBM公司的J9。後來開源捐獻給了Eclipse基金會,更名為OpenJ9。
這兩款虛擬機可以說是虛擬機界的老二。
Liquid
Liquid也是BEA System公司開發的虛擬機,和HotSpot、JRockit等虛擬機項目不同,Liquid是針對特定硬體平台的虛擬機,而不是通用平台的虛擬機。
隨著BEA被Sun收購,Liquid項目也已經停止開發。
Graal虛擬機
2018年4月,Oracle Labs新公開了一項黑科技:Graal VM,從它的口號「Run Programs Faster Anywhere」就能感覺到一顆蓬勃的野心,這句話顯然是與1995年Java剛誕生時的「Write Once,Run Anywhere」在遙相呼應。
Graal VM被官方稱為「Universal VM」和「Polyglot VM」,這是一個在HotSpot虛擬機基礎上增強而成的跨語言全棧虛擬機,可以作為「任何語言」的運行平台使用,這裡「任何語言」包括了Java、Scala、Groovy、Kotlin等基於Java虛擬機之上的語言,還包括了C、C++、Rust等基於LLVM的語言,同時支援其他像JavaScript、Ruby、Python和R語言等。Graal VM可以無額外開銷地混合使用這些程式語言,支援不同語言中混用對方的介面和對象,也能夠支援這些語言使用已經編寫好的本地庫文件。
Graal VM的基本工作原理是將這些語言的源程式碼(例如JavaScript)或源程式碼編譯後的中間格式(例如LLVM位元組碼)通過解釋器轉換為能被Graal VM接受的中間表示(Intermediate Representation,IR),譬如設計一個解釋器專門對LLVM輸出的位元組碼進行轉換來支援C和C++語言,這個過程稱為程式特化(Specialized,也常被稱為Partial Evaluation)。Graal VM提供了Truffle工具集來快速構建面向一種新語言的解釋器,並用它構建了一個稱為Sulong的高性能LLVM位元組碼解釋器。
對Java而言,Graal VM本來就是在HotSpot基礎上誕生的,天生就可作為一套完整的符合Java SE 8標準的Java虛擬機來使用。它和標準的HotSpot的差異主要在即時編譯器上,其執行效率、編譯品質目前與標準版的HotSpot相比也是互有勝負。但現在Oracle Labs和美國大學裡面的研究院所做的最新即時編譯技術的研究全部都遷移至基於Graal VM之上進行了,其發展潛力令人期待。如果Java語言或者HotSpot虛擬機真的有被取代的一天,那從現在看來Graal VM是希望最大的一個候選項,這場革命很可能會在Java使用者沒有明顯感覺的情況下悄然而來,Java世界所有的軟體生態都沒有發生絲毫變化,但天下第一的位置已經悄然更迭。