提及 Java 虛擬機,許多人就會將其與 HotSpot 虛擬機等同看待。但實際上 Java 虛擬機除了 HotSpot 以外,還有 Sun Classic VM、Exact VM、BEA JRocketit、IBM J9 等等。今天咱們就來簡單回顧下 Java 虛擬機的發展歷史。html
在 1996 年 1 月 23 日,Sun 發佈 JDK 1.0,其中自帶的虛擬機就是 Classic VM。但這款虛擬機有個特色,即只能使用純解釋器的方式來執行 Java 代碼,若是要使用 JIT 編譯器那就必須使用外掛。java
tips: 執行代碼能夠分爲編譯執行和解釋執行。解釋執行指的是邊解釋邊運行代碼。編譯執行指的是先編譯,後執行。程序員
但若是外掛了 JIT 編譯器,那麼 JIT 編譯器就徹底替代了虛擬機的執行系統,解釋器便再也不工做了。簡單地說,在 Sun Classic 虛擬機中,解釋器與編譯器沒法共同存在。服務器
並且即便使用了外掛 JIT 編譯器,Sun Classic 虛擬機的執行速度也快不起來。由於解釋器沒法和編譯器配合工做,虛擬機沒法判斷哪一個方法是使用頻率高,因此它只能對每一個方法都進行編譯。這就致使了虛擬機只能採起相對簡單的優化技術,沒法進行耗時稍微較高的優化技術。由於若是對全部代碼都採用耗時高的優化技術,那麼編譯時間會慢得沒法接受。jvm
雖然 Sun Classic 虛擬機有這樣那樣的問題,但其生命力仍是很是旺盛的。在 JDK 1.3 以前,其一直是 JDK 的默認虛擬機。而在 JDK 1.3 時,HotSpot 成爲默認虛擬機,其做爲備用虛擬機存在。到了 JDK 1.4 時,其正式退出歷史舞臺。能夠說 Sun Classic 仍是存在了將近四年的時間,但另一個虛擬機可就沒有那麼好的運氣了。性能
在 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 做爲備用虛擬機。ui
HotSpot VM 能夠說是使用最爲普遍的 Java 虛擬機,幾乎全部的 Java 虛擬機都知道它。但實際上,這個虛擬機並非由 Sun 公司原生開發的,而是由一個叫 Longview Technologies 公司開發的。而 Sun 公司注意到了這款虛擬機在 JIT 編譯上的許多優秀成果,於 1997 年收購了 Longview Technologies 公司,從而得到了 HotSpot VM。spa
要說 HotSpot 不只僅有前面說到兩款虛擬機的優勢(如:準確式內存管理),也有許多本身的新技術,例如:熱點探測技術。熱點探測技術指的是經過執行計數器找出最具優化價值的代碼,而後通知 JIT 編譯器以方法爲單位進行深度優化編譯。但其實 Exact VM 中也有相似的技術,Sun 公司內部還所以大吵了一架,但最終仍是選擇了 HotSpot 做爲默認的虛擬機,其中的原因不得而知。
總的來講,從 2000 年 JDK 1.3 發佈,HotSpot VM 做爲默認的虛擬機開始登上歷史舞臺。到如今 2018 年,18 年時間過去了,其依然是咱們最經常使用的虛擬機,可見 Sun HotSpot 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 服務。
JDK 版本升級不只僅體如今語言和功能特性上,還包括了其編譯和執行的 Java 虛擬機的升級。