JVM除了HotSpot,你還知道哪些?
你好,我是方向盤(YourBatman),坐穩(wěn)扶好,開始發(fā)車。
Title | Link |
所屬專欄 | 【方向盤】-基本功 |
源代碼 | https://github.com/yourbatman/FXP-java-ee |
程序員專用網盤公益上線啦,注冊送1G超小容量,幫你實踐做減法 | https://wangpan.yourbatman.cn |
Java開發(fā)軟件包(Mac) | https://wangpan.yourbatman.cn/s/rEH0 提取碼:javakit |
女媧工程 | http://152.136.106.14:8761 |
版本約定 | [JDK 1.0 - 17] |
前言
如何理解Java是跨平臺的語言?Java是編譯型語言還是解釋型語言?JDK、JRE、JVM有什么區(qū)別?
這三個常見的問題,都繞不開一個主題詞:JVM。每一個Javaer都知道它,可謂又愛又恨,愛它是因為難,恨它也是因為難。
本文當然不是要去“深入理解Java虛擬機”,JVM發(fā)展這么多年,已有非常非常多關于它的權威的書籍、文章、視頻,雖然大都是一看就會,一做就廢...
本文非常輕松,問自己這個問題:“JVM除了HotSpot,你還知道哪些?”然后一起來了解了解JVM的發(fā)展及相關產品。
正文
一個Java虛擬機(JVM)是從未被物理建成硬件假想計算機。JVM 運行編譯成其虛構指令集的程序,該指令集作為稱為字節(jié)碼的中間表示寫入存儲。
在運行時,字節(jié)碼必須從虛構的指令集轉換為主機 CPU 的實際指令集。這可以由“口譯員”即時完成?;蛘咦止?jié)碼可以被完全編譯和緩存,以比通過解釋器運行得更快,在一個稱為即時 (JIT) 編譯的過程中。
幾十年來,有許多JVM 的實現。到現在的2022年,大多數都已經消失了。
基礎知識
老規(guī)矩,首先來個基礎知識鋪墊。
什么是JVM
JVM(Java Virtual Machine),即Java虛擬機。它是Java程序的運行平臺,是二進制字節(jié)碼的運行環(huán)境,它有很多發(fā)行的商用版本,其中最著名的當屬Oracle官方發(fā)行的,也是JDK默認的HotSpot。
JVM發(fā)展到今天,早已不是只為Java服務。它已然成為跨語言的平臺。只要是符合規(guī)范的字節(jié)碼文件交給它就可以執(zhí)行,比如Java就是.class字節(jié)碼,其它語言只需要通過各自的編譯器生成遵循JVM規(guī)范的字節(jié)碼文件,同樣可以運行在JVM上。
JVM規(guī)范
Java語言的各個版本對應的虛擬機規(guī)范:Java Language and Virtual Machine Specifications。
JVM是虛擬機,總的來說是一種標準規(guī)范,虛擬機有很多實現版本,是本文將要介紹的內容。
JVM所處的位置
JVM運行在操作系統(tǒng)之上,和硬件并無直接交互。字節(jié)碼文件運行在JVM之上,從而實現了字節(jié)碼跨平臺的效果。從下圖中可以也能得出一種解決問題的思想:沒有加一層解決不了的問題,如果有,那就再加一層。
跨平臺是如何實現的
這里指的跨平臺指的不是跨操作系統(tǒng),而是交給不同操作系統(tǒng)上的虛擬機幫你執(zhí)行了,屏蔽了底層的適配性。正所謂復雜度不會憑空消失,這里只是JVM幫你解決掉/屏蔽掉了這個復雜度。
一圖勝千言:
編譯器和解釋器的區(qū)別
- 解釋器:直接執(zhí)行用編程語言編寫的指令的程序。
- 編譯器是把源程序的每一條語句都編譯成機器語言,并保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快。
- 編譯器:把源代碼轉換成(翻譯)“低級”語言的程序。
- 解釋器則是只在執(zhí)行程序時,才一條一條的解釋成機器語言給計算機來執(zhí)行,所以運行速度是不如編譯后的程序運行的快的
下面再通過表格對比二者詳細區(qū)別:
編譯器 | 解釋器 |
高級指令轉換為機器可理解的指令 | 無需轉換即可直接執(zhí)行高級代碼 |
將一個程序作為一個整體進行翻譯 | 一條一條地翻譯一個程序 |
生成中間代碼或目標代碼 | 無中間代碼 |
編譯后,將創(chuàng)建一個可執(zhí)行文件 | 每次執(zhí)行都需要解釋 |
編譯器種類:本機編譯器,交叉編譯器,源到源編譯器,一遍編譯器,增量編譯器,源編譯器 | 解釋器種類:字節(jié)碼解釋器,線程代碼解釋器,抽象語法樹解釋器 |
編譯器語言:Java Scala C/C++ C# | 解釋器語言:PHP、Python、Ruby、JS |
JVM發(fā)展史
- 1996年JDK 1.0發(fā)布時,發(fā)布Sun Classic VM。第一款商用虛擬機,純解釋執(zhí)行。
- 1997年JDK 1.1發(fā)布時,虛擬機沒有做變更。
- 1998年JDK 1.2發(fā)布時,提供了Exact VM虛擬機,但僅限運行在Solaris平臺。默認虛擬機依舊是Sun Classic VM。
- Solaris系統(tǒng)是Sun公司研發(fā)的操作系統(tǒng),是UNIX操作系統(tǒng)的衍生版本之一。
- 2000年JDK 1.3發(fā)布時,默認虛擬機由Sun Classic VM改為大名鼎鼎的Sun HotSopt VM。
- 此時Sun Classic VM還并未移除,作為備用。
- 2002年JDK 1.4發(fā)布時,Sun HotSpot VM站穩(wěn)腳跟一直默認都現在,Sun Classic VM徹底退出商用虛擬機舞臺。
- 2003年,Scala正式發(fā)布,同年Groovy也加入JVM陣營。
- 2006年JDK 6發(fā)布時的同年,OpenJDK項目簡歷。順理成章,HotSopt VM也成為了OpenJDK默認虛擬機,直到現在。
- 2008年,Oracle收購BEA,得到了JRockit虛擬機。
- JRockit專注于服務器端應用,內部不包含解析器實現,號稱是世界上最快的JVM。
- 2009年,Oracle收購了Sun,獲得Java商標和HotSpot虛擬機商標。
- 2011年JDK 7發(fā)布時,在JDK1.7u4中,G1垃圾回收期首次路面。
- 2014年JDK 8發(fā)布,用元空間MetaSpace員工間取代了PermGen永久代。
- 2017年JDK 9發(fā)布,G1為HotSpot的默認GC,從此CMS成為歷史。
- 同年,IBM的J9開源, 形成了現在的0pen J9社區(qū)。
- 2018年Android的Java侵權案判決,Google賠償Oracle計88億美元。
- 同年,Oracle宣告JavaEE成為歷史名詞,JDBC、JMS、 Servlet贈予Eclipse基金會。
- 2020、2021、2022。
三大商用虛擬機
在Oracle還沒收購Sun公司之前,JVM虛擬器呈現三足鼎立的局面,各具優(yōu)勢,它們是:
- SUN公司的Hotspot:聊到虛擬機時,若沒做特殊說明,指的就是HotSpot。它是官方出品,純正血統(tǒng)。它的特點/優(yōu)勢是:熱點代碼探測技術,通過計數器找到最具有編譯價值的代碼,觸發(fā)即時編譯器(JIT)或棧上替換。
- BEA公司的JRockit:專注于服務器端應用,內部不包含解釋器,全部代碼都靠即時編譯器編譯執(zhí)行,號稱世界上最快的Java虛擬機。
- IBM公司的J9:市場定位與Hotspot接近,服務端、桌面、嵌入式都有應用,若部署在IBM自己的產品上,號稱是世界上最快的虛擬機。該虛擬機于2017年正式對外發(fā)布,名字為OpenJ9,并交給Eclipse基金會打理。
曾經的三分天下,現在其二已被Oracle收購,不得不感嘆,鈔能力才是最終王者。
Sun Classic VM(始祖)
1996年1月23日,Sun公司發(fā)布JDK1.0,Java語言首次擁有了商用的正式運行環(huán)境,它就是Classic VM。這是第一款商用的虛擬機,是JVM界的始祖。在JDK 1.2及之前,用戶用Classic虛擬機執(zhí)行java-version命令,將會看到類似下 面這行的輸出:
java version “1.2.2” Classic VM (build JDK-1.2.2-001, green threads, sunwjit)
在2002年年發(fā)布的jdk1.4后被完全淘汰,不見其蹤影。
這款虛擬機只能使用純解釋器方式來執(zhí)行Java代碼,如果要使用JIT編譯器(Just In Time 即時編譯器),就必須進行外掛。但是呢,如果外掛了JIT,那么就完全接管了解釋器的工作,那就不能稱作為Classic VM了。
這個階段的虛擬機即使外掛了JIT編譯器輸出本地代碼,執(zhí)行效率也和傳統(tǒng)的C/C++程序有很大差距,Java語言很慢的形象就是在這個時候開始在用戶心中建立起來的。
Exact VM(牛刀小試)
為了解決Sun Classic VM的慢,1998年在JDK 1.2發(fā)布時,曾在Solaris平臺(Sun基于Unix分支自研的操作系統(tǒng))上發(fā)布過一款名為Exact VM的虛擬機,是現代化高性能虛擬機的雛形,如熱點探測、兩級即時編譯器、編譯器與解釋器混合工作模式等。
這塊虛擬機只在Solaris平臺牛刀小試,并未大規(guī)模使用,后被HotSpot取代。
HotSpot VM(武林盟主)
這是一個目前使用范圍最廣的Java虛擬機,它是Oracle JDK和OpenJDK的默認JVM,是聊天時沒有特殊指定時的缺省JVM。
HotSpot VM正如其名,它的熱點代碼探測能力可以通過執(zhí)行計數器找出最具有編譯價值的代碼,然后通知JIT編譯器以方法為單位進行編譯。這樣子可以做到:如果某方法被頻繁調用,將會觸發(fā)標準編譯和OSR(棧上替換)編譯動作,編譯器和解釋器協(xié)同工作,可以在最優(yōu)化的程序響應時間與最佳執(zhí)行性能中取得平衡,而且無須等待本地代碼輸出才能執(zhí)行程序,即時編譯的時間壓力也相對減小,這樣有助于引入更多的代碼優(yōu)化技術。
如果說綜合表現,HotSpot VM可能最佳的虛擬機,它即可應用在資源相對充裕的Serve端,也可用桌面端,可謂通吃。2008年,Oracle收購BEA,得到了JRockit虛擬機;隨后Oracle又收購了Sun,得到了Java和HotSpot虛擬機。JRockit和HotSpot都遵循JVM規(guī)范抽象只是是側重點不同,Oracle最終決定將二者整合(合并),且名稱仍叫HotSpot。
- 2011年發(fā)布JDK 7,完成初步整合:方法區(qū)從永久代里分離出來。
- 之前的JDK版本,常量池在方法區(qū)里,方法區(qū)在永久代里。7版本后分離出來了(但都在堆里)。
- 2014年發(fā)布JDK 8,基本完成整合:廢棄永久代PermGen?,改用元空間。
- JRockit沒有永久代,IBM的J9也沒有永久代。
JRockit VM(被Oracle收購)
JRockit層隸屬于BEA公司,美國NASDAQ上市公司,其中間件市場份額一度比IBM 還要高,2008年初被Oracle 收購。
被Oracle后,同HotSpot合并后取名為HotSpot,從此徹底“銷聲匿跡”。
J9 VM(天下第二)
大名鼎鼎的IBM的J9,和JRockit有很多相似的地方。在IBM自己的機器上號稱世界上最快的JVM虛擬機。IBM J9 VM并不是IBM公司唯一的Java虛擬機,不過是目前其主力發(fā)展的Java虛擬機。
與BEA JRockit專注于服務器端應用不同,IBM J9的市場定位與Sun HotSpot比較接近市場定位和HotSpot基本一樣,實力競品。
2017年,IBM發(fā)布了開源版本的J9 VM,命名為OpenJ9,并交給Eclipse基金會管理,所以也稱為Eclipse OpenJ9。
Azul VM(性能中的戰(zhàn)斗機)
Azul VM是與特定硬件平臺綁定、軟硬件配合的專有虛擬機,所以針對HotSpot做了大量改進,性能非常之高。但是:它只能運行在自己的系統(tǒng)以及硬件平臺上。
Zing VM(通用版Azul VM)
Azul VM的性能非常高,但只能運行在特定的平臺上,不能運行在普通的x86平臺。
2010年,Azul System公司方向一轉,開始從硬件轉向軟件,在Azul VM的基礎上自研,研發(fā)出了可以用在通用的Linux/x86-64平臺的Zing VM,主打低延遲、高實時服務器端JDK市場,性能號稱接近于Azul VM。提供著名的“ReadyNow”能力,參考文檔:https://www.azul.com/products/components/readynow。
但是,Zing VM 不開源,是收費的,并且還很貴很貴。要知道Azul是家商業(yè)化的公司,是要掙錢的呀。這不,在油管我就看到了Azul的廣告:
Liquid VM(JRockit的虛擬化版本)
Liquid VM是JRockit VM 的虛擬化版本,可以在沒有標準操作系統(tǒng)的虛擬機管理程序上運行,允許Java 應用程序直接在虛擬化硬件上運行。
Liquid是BEA公司的產品,2008年后也隸屬于Oracle了,參考文檔:https://docs.oracle.com/cd/E11035_01/wloc10/lvm/index.html。
Taobao VM(國產虛擬機)
Tobao VM,又名阿里JVM。早在2012年,Taobao VM已有一定名氣,那會還有個官網:jvm.taobao.org,現已不能訪問了。阿里巴巴作為國內Java最大應用商,應用集群規(guī)模達十幾萬甚至幾十萬,因此自研JVM很有意義。
Taobao VM的特點:在阿里產品上性能高,硬件嚴重依賴Intel的cpu,損失了兼容性,提高了性能。至于使用了什么技術、什么方式提升了性能,其實咱也不必關心。
為什么現在不見Taobao VM?銷聲匿跡了?是的,因為有了更具產品化的Alibaba Dragonwell這個產品替代了,使用和推廣起來更加方便:待替換,替換成說JDK的那篇文章。
Graal VM
一款號稱Run Programs Faster Anywhere,與1995年Java面世時的口號Write once, Run anywhere遙相呼應。GraalVM是Oracle開源的一款通用虛擬機產品,官方稱之為 Universal GraalVM,是新一代的通用多語言高性能虛擬機。能執(zhí)行各類高性能與互操作性任務,在無需額外開銷的前提下允許用戶構建多語言應用程序。
GraalVM支持大量的語言,包括:
- 基于JVM的語言(例如Java、Scala、Groovy、Kotlin、Clojure等)。
- 基于 LLVM 的語言(例如 C、C++等)。
- 動態(tài)語言(例如 JavaScript、Ruby、Python、R等)。
如果說HotSpot有一天真的被取代,大概率是Graal VM。但這Java的軟件生態(tài)沒有絲毫變化,也許依舊Oracle一家獨大。
除以上之外,還有很多JVM作品:
- Microsoft JVM:微軟早在IE3瀏覽器中支持Java Applets并自研了Microsoft JVM,直到1997年遭到Sun公司起訴才放棄,從而windows都安裝的HotSpot。直到2021年5月份,Microsoft基于OpenJDK重新帶來了其產品化的JDK產品,內置其自研的JVM。
- Apache Harmony:https://harmony.apache.org,Java的世界哪離開得了Apache,曾在JDK 1.5、1.6時期Apache也來參和一腳,這款VM是IBM和Intel聯(lián)合開發(fā)的開源JVM,后遭到Sun公司的抵制不給頒發(fā)JCP認證,無奈2011年黯然退場。
- Dalvik JVM:谷歌開發(fā),應用于Android系統(tǒng)。它只能稱作虛擬機, 并不能稱為Java虛擬機,因為并未遵循規(guī)范。此VM從Android 5.0時被ART VM替換。
- Embedded VM:也叫KVM千字節(jié)虛擬機,應用于移動領域。Sun公司進軍嵌入式領域的虛擬機,用于手機、Pad、汽車等領域,這就是“大名鼎鼎”的J2ME。
總結
這么多虛擬機,我們該如何學習?筆者的經驗是,比較深入的了解學習HotSpot足矣。當然,其它虛擬機、發(fā)展史也需要基本的了解,這是茶余飯后的談資,是專業(yè)素養(yǎng)的體現。
最后,再回頭在看看文首提到的三個問題,你有答案了嗎?