日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
JVM除了HotSpot,你還知道哪些?

你好,我是方向盤(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)消失了。

基礎(chǔ)知識(shí)

老規(guī)矩,首先來個(gè)基礎(chǔ)知識(shí)鋪墊。

什么是JVM

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上。

JVM規(guī)范

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所處的位置

JVM運(yùn)行在操作系統(tǒng)之上,和硬件并無直接交互。字節(jié)碼文件運(yùn)行在JVM之上,從而實(shí)現(xiàn)了字節(jié)碼跨平臺(tái)的效果。從下圖中可以也能得出一種解決問題的思想:沒有加一層解決不了的問題,如果有,那就再加一層。

跨平臺(tái)是如何實(shí)現(xiàn)的

這里指的跨平臺(tái)指的不是跨操作系統(tǒng),而是交給不同操作系統(tǒng)上的虛擬機(jī)幫你執(zhí)行了,屏蔽了底層的適配性。正所謂復(fù)雜度不會(huì)憑空消失,這里只是JVM幫你解決掉/屏蔽掉了這個(gè)復(fù)雜度。

一圖勝千言:

編譯器和解釋器的區(qū)別

  • 解釋器:直接執(zhí)行用編程語言編寫的指令的程序。
  • 編譯器是把源程序的每一條語句都編譯成機(jī)器語言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語言來運(yùn)行此程序,速度很快。
  • 編譯器:把源代碼轉(zhuǎn)換成(翻譯)“低級(jí)”語言的程序。
  • 解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語言給計(jì)算機(jī)來執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的下面再通過表格對(duì)比二者詳細(xì)區(qū)別:

編譯器

解釋器

高級(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

JVM發(fā)展史

  • 1996年JDK 1.0發(fā)布時(shí),發(fā)布Sun Classic VM。第一款商用虛擬機(jī),純解釋執(zhí)行。
  • 1997年JDK 1.1發(fā)布時(shí),虛擬機(jī)沒有做變更。
  • 1998年JDK 1.2發(fā)布時(shí),提供了Exact VM虛擬機(jī),但僅限運(yùn)行在Solaris平臺(tái)。默認(rèn)虛擬機(jī)依舊是Sun Classic VM。
  • Solaris系統(tǒng)是Sun公司研發(fā)的操作系統(tǒng),是UNIX操作系統(tǒng)的衍生版本之一。
  • 2000年JDK 1.3發(fā)布時(shí),默認(rèn)虛擬機(jī)由Sun Classic VM改為大名鼎鼎的Sun HotSopt VM。
  • 此時(shí)Sun Classic VM還并未移除,作為備用。
  • 2002年JDK 1.4發(fā)布時(shí),Sun HotSpot VM站穩(wěn)腳跟一直默認(rèn)都現(xiàn)在,Sun Classic VM徹底退出商用虛擬機(jī)舞臺(tái)。
  • 2003年,Scala正式發(fā)布,同年Groovy也加入JVM陣營(yíng)。
  • 2006年JDK 6發(fā)布時(shí)的同年,OpenJDK項(xiàng)目簡(jiǎn)歷。順理成章,HotSopt VM也成為了OpenJDK默認(rèn)虛擬機(jī),直到現(xiàn)在。
  • 2008年,Oracle收購(gòu)BEA,得到了JRockit虛擬機(jī)。
  • JRockit專注于服務(wù)器端應(yīng)用,內(nèi)部不包含解析器實(shí)現(xiàn),號(hào)稱是世界上最快的JVM。
  • 2009年,Oracle收購(gòu)了Sun,獲得Java商標(biāo)和HotSpot虛擬機(jī)商標(biāo)。
  • 2011年JDK 7發(fā)布時(shí),在JDK1.7u4中,G1垃圾回收期首次路面。
  • 2014年JDK 8發(fā)布,用元空間MetaSpace員工間取代了PermGen永久代。
  • 2017年JDK 9發(fā)布,G1為HotSpot的默認(rèn)GC,從此CMS成為歷史。
  • 同年,IBM的J9開源, 形成了現(xiàn)在的0pen J9社區(qū)。
  • 2018年Android的Java侵權(quán)案判決,Google賠償Oracle計(jì)88億美元。
  • 同年,Oracle宣告JavaEE成為歷史名詞,JDBC、JMS、 Servlet贈(zèng)予Eclipse基金會(huì)。
  • 2020、2021、2022。

三大商用虛擬機(jī)

在Oracle還沒收購(gòu)Sun公司之前,JVM虛擬器呈現(xiàn)三足鼎立的局面,各具優(yōu)勢(shì),它們是:

  1. SUN公司的Hotspot:聊到虛擬機(jī)時(shí),若沒做特殊說明,指的就是HotSpot。它是官方出品,純正血統(tǒng)。它的特點(diǎn)/優(yōu)勢(shì)是:熱點(diǎn)代碼探測(cè)技術(shù),通過計(jì)數(shù)器找到最具有編譯價(jià)值的代碼,觸發(fā)即時(shí)編譯器(JIT)或棧上替換。
  2. BEA公司的JRockit:專注于服務(wù)器端應(yīng)用,內(nèi)部不包含解釋器,全部代碼都靠即時(shí)編譯器編譯執(zhí)行,號(hào)稱世界上最快的Java虛擬機(jī)。
  3. IBM公司的J9:市場(chǎng)定位與Hotspot接近,服務(wù)端、桌面、嵌入式都有應(yīng)用,若部署在IBM自己的產(chǎn)品上,號(hào)稱是世界上最快的虛擬機(jī)。該虛擬機(jī)于2017年正式對(duì)外發(fā)布,名字為OpenJ9,并交給Eclipse基金會(huì)打理。

曾經(jīng)的三分天下,現(xiàn)在其二已被Oracle收購(gòu),不得不感嘆,鈔能力才是最終王者。

Sun Classic VM(始祖)

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í)候開始在用戶心中建立起來的。

Exact VM(牛刀小試)

為了解決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取代。

HotSpot VM(武林盟主)

這是一個(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收購(gòu)BEA,得到了JRockit虛擬機(jī);隨后Oracle又收購(gòu)了Sun,得到了Java和HotSpot虛擬機(jī)。JRockit和HotSpot都遵循JVM規(guī)范抽象只是是側(cè)重點(diǎn)不同,Oracle最終決定將二者整合(合并),且名稱仍叫HotSpot。

  • 2011年發(fā)布JDK 7,完成初步整合:方法區(qū)從永久代里分離出來。
  • 之前的JDK版本,常量池在方法區(qū)里,方法區(qū)在永久代里。7版本后分離出來了(但都在堆里)。
  • 2014年發(fā)布JDK 8,基本完成整合:廢棄永久代PermGen?,改用元空間。
  • JRockit沒有永久代,IBM的J9也沒有永久代。

JRockit VM(被Oracle收購(gòu))

JRockit層隸屬于BEA公司,美國(guó)NASDAQ上市公司,其中間件市場(chǎng)份額一度比IBM 還要高,2008年初被Oracle 收購(gòu)。

被Oracle后,同HotSpot合并后取名為HotSpot,從此徹底“銷聲匿跡”。

J9 VM(天下第二)

大名鼎鼎的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(性能中的戰(zhàn)斗機(jī))

Azul VM是與特定硬件平臺(tái)綁定、軟硬件配合的專有虛擬機(jī),所以針對(duì)HotSpot做了大量改進(jìn),性能非常之高。但是:它只能運(yùn)行在自己的系統(tǒng)以及硬件平臺(tái)上。

Zing VM(通用版Azul VM)

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的虛擬化版本)

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。

Taobao VM(國(guó)產(chǎn)虛擬機(jī))

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的那篇文章。

Graal VM

一款號(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支持大量的語言,包括:

  • 基于JVM的語言(例如Java、Scala、Groovy、Kotlin、Clojure等)。
  • 基于 LLVM 的語言(例如 C、C++等)。
  • 動(dòng)態(tài)語言(例如 JavaScript、Ruby、Python、R等)。

如果說HotSpot有一天真的被取代,大概率是Graal VM。但這Java的軟件生態(tài)沒有絲毫變化,也許依舊Oracle一家獨(dú)大。

除以上之外,還有很多JVM作品:

  • Microsoft JVM:微軟早在IE3瀏覽器中支持Java Applets并自研了Microsoft JVM,直到1997年遭到Sun公司起訴才放棄,從而windows都安裝的HotSpot。直到2021年5月份,Microsoft基于OpenJDK重新帶來了其產(chǎn)品化的JDK產(chǎn)品,內(nèi)置其自研的JVM。
  • Apache Harmony:https://harmony.apache.org,Java的世界哪離開得了Apache,曾在JDK 1.5、1.6時(shí)期Apache也來參和一腳,這款VM是IBM和Intel聯(lián)合開發(fā)的開源JVM,后遭到Sun公司的抵制不給頒發(fā)JCP認(rèn)證,無奈2011年黯然退場(chǎng)。
  • Dalvik JVM:谷歌開發(fā),應(yīng)用于Android系統(tǒng)。它只能稱作虛擬機(jī), 并不能稱為Java虛擬機(jī),因?yàn)椴⑽醋裱?guī)范。此VM從Android 5.0時(shí)被ART VM替換。
  • Embedded VM:也叫KVM千字節(jié)虛擬機(jī),應(yīng)用于移動(dòng)領(lǐng)域。Sun公司進(jìn)軍嵌入式領(lǐng)域的虛擬機(jī),用于手機(jī)、Pad、汽車等領(lǐng)域,這就是“大名鼎鼎”的J2ME。

總結(jié)

這么多虛擬機(jī),我們?cè)撊绾螌W(xué)習(xí)?筆者的經(jīng)驗(yàn)是,比較深入的了解學(xué)習(xí)HotSpot足矣。當(dāng)然,其它虛擬機(jī)、發(fā)展史也需要基本的了解,這是茶余飯后的談資,是專業(yè)素養(yǎng)的體現(xiàn)。

最后,再回頭在看看文首提到的三個(gè)問題,你有答案了嗎?


網(wǎng)站欄目:JVM除了HotSpot,你還知道哪些?
文章出自:http://www.5511xx.com/article/djhhpis.html