一、摘要
眾所周知,Java 經過多年的發展,已經從一門單純的計算機程式語言,發展成了一套成熟的軟體解決方案。從網際網路到企業平臺,Java 是目前使用最廣泛的程式語言。
以下這段內容是來自 Java 的官方介紹!
從膝上型電腦到資料中心,從遊戲控制檯到科學超級計算機,從手機到網際網路,Java 無處不在!
無論是是網際網路公司還是傳統的企業,在研發數字化平臺系統時,世界上絕大部分的公司基本上都會首選採用 Java 來開發,以助力企業的數字化轉型和生產效率的提升,原因就不多說了,安全、穩定、高效能、跨平臺等等,其實還有一個很大的優勢:好招人,哈哈哈~~
而 Java 之所以如此有魅力,不僅限於它優秀的程式語言設計,其中還有一個很重要的原因得益於它的虛擬機器平臺設計,透過它的虛擬機器可以輕鬆實現應用程式跨平臺執行,實現“一次編寫,到處執行”的目標,並且還可以取得不錯的執行效率。
二、Java 簡介
在介紹虛擬機器之前,我們還是簡單的回顧一下 Java 的發展故事。
Java 最早是由 SUN 公司的一個小工程師團隊在上個世紀 90 年代初開發的一種程式語言,其中詹姆斯·高斯林是專案負責人(人稱 Java 之父),程式語言最初被命名為 Oak,以他們的辦公室外的橡樹而命名,後來因為 Oak 已經被人註冊了,因此重新改名成 Java。
在此,我們附上一張 Java 之父的光輝圖片!
當時的目標是將其用於開發數字有線電視行業的嵌入式應用程式,例如機頂盒、智慧電視等數字裝置,實現無障礙的執行。結果推出以後,市場沒啥反響。4 年後,技術小組不得不解散。
但也就在此時,網際網路剛剛崛起,恰巧這時 MarkArdreesen 開發的 Mosaic 和 Netscape 啟發了 Oak 專案組成員,他們利用 Java 編寫了 HotJava 瀏覽器,HotJava 擁有了在頁面中執行 Java 程式碼的能力,可以無障礙的執行在各個電腦裝置上,這個效果得到了 Sun 公司執行長 ScottMcNealy 的支援,觸發了 Java 進軍 Internet 的決心。
這在當時引起了不小的轟動,人們從中似乎看到了網際網路未來該有的樣子,一時間,Java 受到了眾多廠商和開發者的追捧。於是趁熱打鐵,Sun 在 1996 年正式釋出了 JDK1.0,當時最主要的十個作業系統廠商宣佈,將在它們的系統中支援 Java 程式的執行,從此在網際網路高速發展中大殺四方。
Java 之所以能在網際網路發展中獲得廣泛的開發者支援,一個很重要的原因就是它可以實現“一次編寫,到處執行”的效果,極大的省去了軟體開發工作量,能實現這種效果主要得益於 Java 的架構理念設計。
像 C、C++ 等程式語言,程式碼是直接編譯成機器碼執行,雖然很快,但是不同的平臺(x86、ARM等) CPU 的指令集也不同,每次開發一個應用程式需要編譯出每一種平臺的對應機器碼,非常麻煩。
Java 則不同,它會將程式碼編譯成一種“位元組碼”,它類似於抽象的 CPU 指令,然後虛擬機器負責載入位元組碼,根據不同的平臺編譯成對應的機器碼並執行,這樣就可以實現了“一次編寫,到處執行”的效果。
當然,對於虛擬機器,需要針對每個平臺分別開發,為了保證不同平臺、不同公司開發的虛擬機器都能正確執行 Java 位元組碼,SUN 公司制定了一系列的 Java 虛擬機器規範。從實踐的角度來看,虛擬機器的相容性做得非常好,低版本的 Java 位元組碼完全可以正常執行在高版本的虛擬機器上。
整個 JDK 內部結構,可以用如下圖來概括(圖片來自於廖雪峰的Java介紹)
JDK、JRE 和 JVM 三者之間的關係,可以用如下內容來簡要描述。
- JDK(Java Development Kit):指的是 Java 語言的軟體開發工具包,包括編譯器、偵錯程式、Java API 類庫、Java 虛擬機器等內容,通常用於開發環境
- JRE(Java Runtime Environment):指的是 Java 執行時環境,包括 Java API 類庫、Java 虛擬機器等內容,通常用於執行 Java 應用程式,通常用於生產環境
- JVM(Java Virtual Machine):指的是 Java 虛擬機器,用於在不同的平臺上執行 Java 應用程式
可以清晰的看到,JVM 是 Java 應用程式能實現跨平臺執行的核心。因此,瞭解和學習 JVM 相關的知識,有助於開發者對 Java 相關技術有著更全面的認識。
在作業系統的命令列,輸入java -version
,即可看到當前 JDK 採用的是哪種版本的虛擬機器。
三、虛擬機器簡介
說起 Java 虛擬機器,許多開發者可能首先會想到 HotSpot 虛擬機器,正如上文的截圖部分。
實際上 Java 虛擬機器除了 HotSpot 之外,還有 Sun Classic VM、Exact VM、BEA JRockit VM、IBM J9 VM等等,虛擬機器的發展過程,可以用百花齊放這四個字來概括。
3.1、Sun Classic VM
在 1996 年,Sun 釋出 JDK 1.0 時,其中自帶的虛擬機器就是 Classic VM。這款虛擬機器使用的是純直譯器的方式來執行 Java 程式碼,簡單的說就是邊解釋邊執行程式碼,並非像現在這樣透過編譯器的方式來執行程式碼(先編譯、後執行)。在 Sun Classic 虛擬機器中,直譯器與編譯器無法共同存在,因此 Java 應用程式執行速度上肯定快不起來,只能說夠用。
在 1998 年,Sun 在釋出 JDK 1.2 時,同時也公佈了一款名為 Exact VM 的虛擬機器,這款虛擬機器嘗試解決了 Classic VM 遇到的所有問題。它的執行系統解決了 Classic VM 存在的直譯器和編譯器無法同時工作的問題,同時還具備了一些現代高效能處理器的特性,如:兩級即時編譯、準確式記憶體管理等。
但可惜的是,這款虛擬機器一直沒有真正被大規模使用過,此時 Sun Classic VM 依然作為預設的 Java 虛擬機器。
3.2、HotSpot VM
在 2000 年,Sun 在釋出 JDK 1.3 時,公佈將 HotSpot VM 作為預設的 Java 虛擬機器,也就是大家廣為流傳的 Java 虛擬機器。
實際上,這個虛擬機器並不是由 Sun 公司原生開發的,而是由一個叫 Longview Technologies 公司開發的,Sun 公司注意到了這款虛擬機器在 JIT 編譯上的許多優秀成果,於 1997 年收購了 Longview Technologies 公司,從而獲得了 HotSpot VM 的所有權。
HotSpot VM 不僅僅有前面說到兩款虛擬機器的優點,也有許多自己的新技術,例如:熱點探測技術。熱點探測技術指的是透過執行計數器找出最具最佳化價值的程式碼,然後通知 JIT 編譯器以方法為單位進行深度最佳化編譯。
其實 Exact VM 中也有類似的技術,但最終還是選擇了 HotSpot 作為預設的虛擬機器。
HotSpot VM 作為預設的 Java 虛擬機器之後,直到現在,依然是我們最常用的虛擬機器,可見 HotSpot VM 的生命力之頑強!
3.3、BEA JRockit / IBM J9 VM
前面說的是 Sun 公司研發的虛擬機器,但除了 Sun 公司之外,其他組織、公司也研發過不少的虛擬機器實現,其中最著名的就是 BEA 公司的 JRockit VM 和 IBM 公司的 J9 VM 了。
JRockit VM 是除 HotSpot 之外另一款響噹噹的虛擬機器,BEA 公司在 2002 年收購的了此虛擬機器的開發商。這款虛擬機器在相當一段時間裡獲稱世界上速度最快的 Java 虛擬機器,它是一款專注於伺服器端應用的虛擬機器,並且它的垃圾收集演算法相比其它所有虛擬機器表現更佳;此外,其提供的 MissionControl 服務套件也十分強大。
IBM 公司的 J9 VM 則是一款比較通用的虛擬機器,其定位應用於從服務端到桌面應用,再到嵌入式的多用途虛擬機器。IBM 公司開發 J9 VM 的目的是將其作為 IBM 公司各種 Java 產品的執行平臺。稍有不同的是,IBM J9 VM 都只能跟 IBM 產品一起使用,雖然不存在技術限制,但是需要單獨的商業許可證。
J9 VM 的效能水平大致跟 HotSpot VM 是一個檔次的,在一些場景下,有時 HotSpot VM 快些,有時 J9 VM 快些。
3.4、其它 JVM
HotSpot、JRockit 和 J9 這三個虛擬機器,曾經在很長的時間並稱三大主流 JVM,可以說是 Java 虛擬機器發展史上比較耀眼的部分。除此之外,其實還有各種各樣的小範圍使用的虛擬機器。
例如 Azul VM 和 BEA Liquid VM 的專用商業虛擬機器,效能非常強悍,可以管理至少數十個 CPU 和數百 GB 的記憶體資源,還提供在巨大記憶體範圍內實現可控 GC 時間的垃圾收集器等等,這些虛擬機器只執行在特定硬體平臺,因此要求也比較高。
此外還有許許多多其他的虛擬機器存在,例如:Apache Harmony、Google Android Dalvik VM、Mircosoft JVM 等等,都在各自領域發揮作用。
3.5、Oralce
誰都沒想到 Sun 公司技術如此的強大,卻在之後的歲月裡逐漸走向隕落,因為不懂銷售和運營,導致公司財務逐漸出現虧損,在 2009 年,Oracle 公司以現金方式收購 Sun 公司,交易價格達 74 億美元。
此前,Oracle 公司在 2008 年收購了 BEA 公司,獲得了 JRocket VM 的所有權;這意味著 JRockit 與 HotSpot 同屬於 Oracle 所有。
實際上,現在 JDK1.8 的 HotSpot VM 已經是以前的 HotSpot VM 與 JRockit VM 的合併版,也就是傳說中的“HotRockit”,只是產品里名字還是叫 HotSpot VM。
後續的 JVM 發展,相信會越來越好,我們拭目以待!
四、小結
本文主要圍繞 Java 的發展歷史,對虛擬機器的誕生歷史做了一次知識總結,在後續的文章中,我們會對 JVM 相關知識進行總結和分享,如果有描述不對的地方,歡迎大家留言指出,不勝感激!
五、參考
1.https://www.liaoxuefeng.com/wiki/1252599548343744/1255876875896416
2.https://www.cnblogs.com/xrq730/p/4826691.html
3.https://www.cnblogs.com/chanshuyi/p/jvm_serial_02_the_history_of_jvm.html