掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
你好,我是方向盤(YourBatman),坐穩(wěn)扶好,開始發(fā)車。

創(chuàng)新互聯(lián)是一家專業(yè)提供無錫企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站制作、做網(wǎng)站、H5頁面制作、小程序制作等業(yè)務(wù)。10年已為無錫眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站建設(shè)公司優(yōu)惠進(jìn)行中。
|
Title |
Link |
|
所屬專欄 |
【方向盤】-基本功 |
|
源代碼 |
https://github.com/yourbatman/FXP-java-ee |
|
程序員專用網(wǎng)盤公益上線啦,注冊(cè)送1G超小容量,幫你實(shí)踐做減法 |
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是跨平臺(tái)的語言?Java是編譯型語言還是解釋型語言?JDK、JRE、JVM有什么區(qū)別?
這三個(gè)常見的問題,都繞不開一個(gè)主題詞:JVM。每一個(gè)Javaer都知道它,可謂又愛又恨,愛它是因?yàn)殡y,恨它也是因?yàn)殡y。
本文當(dāng)然不是要去“深入理解Java虛擬機(jī)”,JVM發(fā)展這么多年,已有非常非常多關(guān)于它的權(quán)威的書籍、文章、視頻,雖然大都是一看就會(huì),一做就廢...
本文非常輕松,問自己這個(gè)問題:“JVM除了HotSpot,你還知道哪些?”然后一起來了解了解JVM的發(fā)展及相關(guān)產(chǎn)品。
一個(gè)Java虛擬機(jī)(JVM)是從未被物理建成硬件假想計(jì)算機(jī)。JVM 運(yùn)行編譯成其虛構(gòu)指令集的程序,該指令集作為稱為字節(jié)碼的中間表示寫入存儲(chǔ)。
在運(yùn)行時(shí),字節(jié)碼必須從虛構(gòu)的指令集轉(zhuǎn)換為主機(jī) CPU 的實(shí)際指令集。這可以由“口譯員”即時(shí)完成?;蛘咦止?jié)碼可以被完全編譯和緩存,以比通過解釋器運(yùn)行得更快,在一個(gè)稱為即時(shí) (JIT) 編譯的過程中。
幾十年來,有許多JVM 的實(shí)現(xiàn)。到現(xiàn)在的2022年,大多數(shù)都已經(jīng)消失了。
老規(guī)矩,首先來個(gè)基礎(chǔ)知識(shí)鋪墊。
JVM(Java Virtual Machine),即Java虛擬機(jī)。它是Java程序的運(yùn)行平臺(tái),是二進(jìn)制字節(jié)碼的運(yùn)行環(huán)境,它有很多發(fā)行的商用版本,其中最著名的當(dāng)屬Oracle官方發(fā)行的,也是JDK默認(rèn)的HotSpot。
JVM發(fā)展到今天,早已不是只為Java服務(wù)。它已然成為跨語言的平臺(tái)。只要是符合規(guī)范的字節(jié)碼文件交給它就可以執(zhí)行,比如Java就是.class字節(jié)碼,其它語言只需要通過各自的編譯器生成遵循JVM規(guī)范的字節(jié)碼文件,同樣可以運(yùn)行在JVM上。
Java語言的各個(gè)版本對(duì)應(yīng)的虛擬機(jī)規(guī)范:Java Language and Virtual Machine Specifications。
JVM是虛擬機(jī),總的來說是一種標(biāo)準(zhǔn)規(guī)范,虛擬機(jī)有很多實(shí)現(xiàn)版本,是本文將要介紹的內(nèi)容。
JVM運(yùn)行在操作系統(tǒng)之上,和硬件并無直接交互。字節(jié)碼文件運(yùn)行在JVM之上,從而實(shí)現(xiàn)了字節(jié)碼跨平臺(tái)的效果。從下圖中可以也能得出一種解決問題的思想:沒有加一層解決不了的問題,如果有,那就再加一層。
這里指的跨平臺(tái)指的不是跨操作系統(tǒng),而是交給不同操作系統(tǒng)上的虛擬機(jī)幫你執(zhí)行了,屏蔽了底層的適配性。正所謂復(fù)雜度不會(huì)憑空消失,這里只是JVM幫你解決掉/屏蔽掉了這個(gè)復(fù)雜度。
一圖勝千言:
|
編譯器 |
解釋器 |
|
高級(jí)指令轉(zhuǎn)換為機(jī)器可理解的指令 |
無需轉(zhuǎn)換即可直接執(zhí)行高級(jí)代碼 |
|
將一個(gè)程序作為一個(gè)整體進(jìn)行翻譯 |
一條一條地翻譯一個(gè)程序 |
|
生成中間代碼或目標(biāo)代碼 |
無中間代碼 |
|
編譯后,將創(chuàng)建一個(gè)可執(zhí)行文件 |
每次執(zhí)行都需要解釋 |
|
編譯器種類:本機(jī)編譯器,交叉編譯器,源到源編譯器,一遍編譯器,增量編譯器,源編譯器 |
解釋器種類:字節(jié)碼解釋器,線程代碼解釋器,抽象語法樹解釋器 |
|
編譯器語言:Java Scala C/C++ C# |
解釋器語言:PHP、Python、Ruby、JS |
在Oracle還沒收購Sun公司之前,JVM虛擬器呈現(xiàn)三足鼎立的局面,各具優(yōu)勢(shì),它們是:
曾經(jīng)的三分天下,現(xiàn)在其二已被Oracle收購,不得不感嘆,鈔能力才是最終王者。
1996年1月23日,Sun公司發(fā)布JDK1.0,Java語言首次擁有了商用的正式運(yùn)行環(huán)境,它就是Classic VM。這是第一款商用的虛擬機(jī),是JVM界的始祖。在JDK 1.2及之前,用戶用Classic虛擬機(jī)執(zhí)行java-version命令,將會(huì)看到類似下 面這行的輸出:
java version “1.2.2” Classic VM (build JDK-1.2.2-001, green threads, sunwjit)
在2002年年發(fā)布的jdk1.4后被完全淘汰,不見其蹤影。
這款虛擬機(jī)只能使用純解釋器方式來執(zhí)行Java代碼,如果要使用JIT編譯器(Just In Time 即時(shí)編譯器),就必須進(jìn)行外掛。但是呢,如果外掛了JIT,那么就完全接管了解釋器的工作,那就不能稱作為Classic VM了。
這個(gè)階段的虛擬機(jī)即使外掛了JIT編譯器輸出本地代碼,執(zhí)行效率也和傳統(tǒng)的C/C++程序有很大差距,Java語言很慢的形象就是在這個(gè)時(shí)候開始在用戶心中建立起來的。
為了解決Sun Classic VM的慢,1998年在JDK 1.2發(fā)布時(shí),曾在Solaris平臺(tái)(Sun基于Unix分支自研的操作系統(tǒng))上發(fā)布過一款名為Exact VM的虛擬機(jī),是現(xiàn)代化高性能虛擬機(jī)的雛形,如熱點(diǎn)探測(cè)、兩級(jí)即時(shí)編譯器、編譯器與解釋器混合工作模式等。
這塊虛擬機(jī)只在Solaris平臺(tái)牛刀小試,并未大規(guī)模使用,后被HotSpot取代。
這是一個(gè)目前使用范圍最廣的Java虛擬機(jī),它是Oracle JDK和OpenJDK的默認(rèn)JVM,是聊天時(shí)沒有特殊指定時(shí)的缺省JVM。
HotSpot VM正如其名,它的熱點(diǎn)代碼探測(cè)能力可以通過執(zhí)行計(jì)數(shù)器找出最具有編譯價(jià)值的代碼,然后通知JIT編譯器以方法為單位進(jìn)行編譯。這樣子可以做到:如果某方法被頻繁調(diào)用,將會(huì)觸發(fā)標(biāo)準(zhǔn)編譯和OSR(棧上替換)編譯動(dòng)作,編譯器和解釋器協(xié)同工作,可以在最優(yōu)化的程序響應(yīng)時(shí)間與最佳執(zhí)行性能中取得平衡,而且無須等待本地代碼輸出才能執(zhí)行程序,即時(shí)編譯的時(shí)間壓力也相對(duì)減小,這樣有助于引入更多的代碼優(yōu)化技術(shù)。
如果說綜合表現(xiàn),HotSpot VM可能最佳的虛擬機(jī),它即可應(yīng)用在資源相對(duì)充裕的Serve端,也可用桌面端,可謂通吃。2008年,Oracle收購BEA,得到了JRockit虛擬機(jī);隨后Oracle又收購了Sun,得到了Java和HotSpot虛擬機(jī)。JRockit和HotSpot都遵循JVM規(guī)范抽象只是是側(cè)重點(diǎn)不同,Oracle最終決定將二者整合(合并),且名稱仍叫HotSpot。
JRockit層隸屬于BEA公司,美國(guó)NASDAQ上市公司,其中間件市場(chǎng)份額一度比IBM 還要高,2008年初被Oracle 收購。
被Oracle后,同HotSpot合并后取名為HotSpot,從此徹底“銷聲匿跡”。
大名鼎鼎的IBM的J9,和JRockit有很多相似的地方。在IBM自己的機(jī)器上號(hào)稱世界上最快的JVM虛擬機(jī)。IBM J9 VM并不是IBM公司唯一的Java虛擬機(jī),不過是目前其主力發(fā)展的Java虛擬機(jī)。
與BEA JRockit專注于服務(wù)器端應(yīng)用不同,IBM J9的市場(chǎng)定位與Sun HotSpot比較接近市場(chǎng)定位和HotSpot基本一樣,實(shí)力競(jìng)品。
2017年,IBM發(fā)布了開源版本的J9 VM,命名為OpenJ9,并交給Eclipse基金會(huì)管理,所以也稱為Eclipse OpenJ9。
Azul VM是與特定硬件平臺(tái)綁定、軟硬件配合的專有虛擬機(jī),所以針對(duì)HotSpot做了大量改進(jìn),性能非常之高。但是:它只能運(yùn)行在自己的系統(tǒng)以及硬件平臺(tái)上。
Azul VM的性能非常高,但只能運(yùn)行在特定的平臺(tái)上,不能運(yùn)行在普通的x86平臺(tái)。
2010年,Azul System公司方向一轉(zhuǎn),開始從硬件轉(zhuǎn)向軟件,在Azul VM的基礎(chǔ)上自研,研發(fā)出了可以用在通用的Linux/x86-64平臺(tái)的Zing VM,主打低延遲、高實(shí)時(shí)服務(wù)器端JDK市場(chǎng),性能號(hào)稱接近于Azul VM。提供著名的“ReadyNow”能力,參考文檔:https://www.azul.com/products/components/readynow。
但是,Zing VM 不開源,是收費(fèi)的,并且還很貴很貴。要知道Azul是家商業(yè)化的公司,是要掙錢的呀。這不,在油管我就看到了Azul的廣告:
Liquid VM是JRockit VM 的虛擬化版本,可以在沒有標(biāo)準(zhǔn)操作系統(tǒng)的虛擬機(jī)管理程序上運(yùn)行,允許Java 應(yīng)用程序直接在虛擬化硬件上運(yùn)行。
Liquid是BEA公司的產(chǎn)品,2008年后也隸屬于Oracle了,參考文檔:https://docs.oracle.com/cd/E11035_01/wloc10/lvm/index.html。
Tobao VM,又名阿里JVM。早在2012年,Taobao VM已有一定名氣,那會(huì)還有個(gè)官網(wǎng):jvm.taobao.org,現(xiàn)已不能訪問了。阿里巴巴作為國(guó)內(nèi)Java最大應(yīng)用商,應(yīng)用集群規(guī)模達(dá)十幾萬甚至幾十萬,因此自研JVM很有意義。
Taobao VM的特點(diǎn):在阿里產(chǎn)品上性能高,硬件嚴(yán)重依賴Intel的cpu,損失了兼容性,提高了性能。至于使用了什么技術(shù)、什么方式提升了性能,其實(shí)咱也不必關(guān)心。
為什么現(xiàn)在不見Taobao VM?銷聲匿跡了?是的,因?yàn)橛辛烁弋a(chǎn)品化的Alibaba Dragonwell這個(gè)產(chǎn)品替代了,使用和推廣起來更加方便:待替換,替換成說JDK的那篇文章。
一款號(hào)稱Run Programs Faster Anywhere,與1995年Java面世時(shí)的口號(hào)Write once, Run anywhere遙相呼應(yīng)。GraalVM是Oracle開源的一款通用虛擬機(jī)產(chǎn)品,官方稱之為 Universal GraalVM,是新一代的通用多語言高性能虛擬機(jī)。能執(zhí)行各類高性能與互操作性任務(wù),在無需額外開銷的前提下允許用戶構(gòu)建多語言應(yīng)用程序。
GraalVM支持大量的語言,包括:
如果說HotSpot有一天真的被取代,大概率是Graal VM。但這Java的軟件生態(tài)沒有絲毫變化,也許依舊Oracle一家獨(dú)大。
除以上之外,還有很多JVM作品:
這么多虛擬機(jī),我們?cè)撊绾螌W(xué)習(xí)?筆者的經(jīng)驗(yàn)是,比較深入的了解學(xué)習(xí)HotSpot足矣。當(dāng)然,其它虛擬機(jī)、發(fā)展史也需要基本的了解,這是茶余飯后的談資,是專業(yè)素養(yǎng)的體現(xiàn)。
最后,再回頭在看看文首提到的三個(gè)問題,你有答案了嗎?

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流