JVM基礎系列第2講:Java 虛擬機的歷史


說起 Java 虛擬機,許多人就會將其與 HotSpot 虛擬機等同看待。但實際上 Java 虛擬機除了 HotSpot 之外,還有 Sun Classic VM、Exact VM、BEA JRocketit、IBM J9 等等。今天我們就來簡單回顧下 Java 虛擬機的發展歷史。

虛擬機始祖:Sun Classic

在 1996 年 1 月 23 日,Sun 發布 JDK 1.0,其中自帶的虛擬機就是 Classic VM。但這款虛擬機有個特點,即只能使用純解釋器的方式來執行 Java 代碼,如果要使用 JIT 編譯器那就必須使用外掛。

tips: 執行代碼可以分為編譯執行和解釋執行。解釋執行指的是邊解釋邊運行代碼。編譯執行指的是先編譯,后執行。

但如果外掛了 JIT 編譯器,那么 JIT 編譯器就完全替代了虛擬機的執行系統,解釋器便不再工作了。簡單地說,在 Sun Classic 虛擬機中,解釋器與編譯器無法共同存在。

而且即使使用了外掛 JIT 編譯器,Sun Classic 虛擬機的執行速度也快不起來。因為解釋器無法和編譯器配合工作,虛擬機無法判斷哪個方法是使用頻率高,所以它只能對每個方法都進行編譯。這就導致了虛擬機只能采取相對簡單的優化技術,無法進行耗時稍微較高的優化技術。因為如果對所有代碼都采用耗時高的優化技術,那么編譯時間會慢得無法接受。

雖然 Sun Classic 虛擬機有這樣那樣的問題,但其生命力還是非常旺盛的。在 JDK 1.3 之前,其一直是 JDK 的默認虛擬機。而在 JDK 1.3 時,HotSpot 成為默認虛擬機,其作為備用虛擬機存在。到了 JDK 1.4 時,其正式退出歷史舞台。可以說 Sun Classic 還是存在了將近四年的時間,但另外一個虛擬機可就沒有那么好的運氣了。

無疾而終:Sun Exact VM

在 Sun Classic 發布后,Sun 的虛擬機團隊在 JDK 1.2 時 發布了一款名為 Exact VM 的虛擬機,嘗試解決 Classic VM 遇到的所有問題。它的執行系統解決了 Classic VM 存在的解釋器和編譯器無法同時工作的問題,還具備了一些現代高性能處理器的特性,如:兩級即時編譯等。

除此之外,Exact VM 還改進了虛擬機的對象查找方式。在 Classic VM 中,如果要查找一個對象,那么需要通過句柄(類似指針)來查找。如果需要查找一個對象,那么需要通過其構建成的句柄樹一層層尋找。但在 Exact VM 中使用了准確式內存管理(Exact Memory Management),即虛擬機可以知道內存中某個位置的數據具體是什么類型,這樣就減少了查找的的開銷,提升執行性能。

但可惜的是,雖然 ExactVM 發布了,但一直到它退出時,其都沒有真正被大規模使用過。在 JDK 1.2 其發布時,Exact VM 推出,但Sun Classic VM 依然作為默認的 Java 虛擬機。在 JDK 1.3 發布時,推出虛擬機 HotSpot VM 作為默認虛擬機,而 Sun Classic VM 作為備用虛擬機。

武林盟主:Sun HotSpot VM

HotSpot VM 可以說是使用最為廣泛的 Java 虛擬機,幾乎所有的 Java 虛擬機都知道它。但實際上,這個虛擬機並不是由 Sun 公司原生開發的,而是由一個叫 Longview Technologies 公司開發的。而 Sun 公司注意到了這款虛擬機在 JIT 編譯上的許多優秀成果,於 1997 年收購了 Longview Technologies 公司,從而獲得了 HotSpot VM。

要說 HotSpot 不僅僅有前面說到兩款虛擬機的優點(如:准確式內存管理),也有許多自己的新技術,例如:熱點探測技術。熱點探測技術指的是通過執行計數器找出最具優化價值的代碼,然后通知 JIT 編譯器以方法為單位進行深度優化編譯。但其實 Exact VM 中也有類似的技術,Sun 公司內部還因此大吵了一架,但最終還是選擇了 HotSpot 作為默認的虛擬機,其中的緣由不得而知。

總的來說,從 2000 年 JDK 1.3 發布,HotSpot VM 作為默認的虛擬機開始登上歷史舞台。到現在 2018 年,18 年時間過去了,其依然是我們最常用的虛擬機,可見 Sun HotSpot VM 的生命力之頑強。

百家爭鳴:BEA JRockit / IBM J9 VM

前面說的都是 Sun 公司推出的虛擬機,但除了 Sun 公司之外,其他組織、公司也研發過不少的虛擬機實現,其中最著名的要算 BEA 公司的 BEA JRockit 和 IBM 公司的 J9 VM 了。

BEA 公司的 JRockit 是一款專注於服務器硬件和服務端應用場景的虛擬機,其針對服務端場景做了大量的優化,因此其不太關注程序啟動速度。JRockit 虛擬機內部不包含解釋器實現,全部代碼都靠即時編譯器編譯后執行。此外,其提供的 MissionControl 服務套件也十分強大。

IBM 公司的 J9 VM 則是一款比較通用的虛擬機,其定位應用於從服務端到桌面應用再到嵌入式的多用途虛擬機。IBM 公司開發 J9 VM 的目的是將其作為 IBM 公司各種 Java 產品的執行平台。

武林外傳:那些無名虛擬機

從 Sun Classic、Sun Exact VM、Sun HotSpot VM,再到 BEA JRockit、IBM J9 VM,這幾個虛擬機可以說是虛擬機的正史了,是每個 Java 程序員應該了解的。但在這之外,其實還有各種各樣的虛擬機存在。

例如性能最強悍的並不是上面所說的虛擬機,而是名為 Azul VM 和 BEA Liquid VM 的專用商業及虛擬機。這些虛擬機只運行在特定硬件平台,因此要求比較高。但其性能也是非常強悍的。其可以管理至少數十個 CPU 和數百 GB 的內存資源,還提供在巨大內存范圍內實現可控 GC 時間的垃圾收集器等等。

此外還有許許多多其他的虛擬機存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft JVM 等等。

最后的贏家:Oracle

看了這么些歷史,似乎都是在說 Sun公司發布的虛擬機,與 Oracle 似乎沒有什么關系。但在 2010 年,Oracle 公司收購了 Sun 公司,這樣 Oracle 就擁有了 HotSpot VM。再加上其在 2008 年收購 BEA 公司獲得的 JRocket VM,Oracle 公司就擁有了地球上最優秀的兩款虛擬機。

對於虛擬機未來的規划,Oracle 宣布會將 JRockit 的優秀特性整合到 HotSpot VM 中,例如移植 JRockit 的垃圾回收器和 MissionControl 服務。

附錄:Java 虛擬機歷史

JDK 版本升級不僅僅體現在語言和功能特性上,還包括了其編譯和執行的 Java 虛擬機的升級。

  • 1996 年,JDK 1.0 發布時,提供了純解釋執行的 Java 虛擬機實現:Sun Classic VM。
  • 1997 年,JDK 1.1 發布時,虛擬機沒有做變更,依然使用 Sun Classic VM 作為默認的虛擬機。
  • 1998 年,JDK 1.2 發布時,提供了運行在 Solaris 平台的 Exact VM 虛擬機,但此時還是用 Sun Classic VM 作為默認的 Java 虛擬機。
  • 2000 年,JDK1.3 發布,默認的 Java 虛擬機由 Sun Classic VM 改為 Sun HotSopt VM,而 Sun Classic VM 則作為備用虛擬機。
  • 2002 年,JDK 1.4 發布,Sun Classic VM 退出商用虛擬機舞台,直接使用 Sun HotSpot VM 作為默認虛擬機一直到現在。

參考資料


JVM基礎系列文章目錄


免責聲明!

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



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