目前主流的 Java 虛擬機(jī)有哪些?
時(shí)間:2024-01-24 22:20:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2024-01-24 22:20:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
目前主流的 Java 虛擬機(jī)有哪些?:Wikipedia那個(gè)
Comparison of Java virtual machines頁(yè)面給JVM實(shí)現(xiàn)分得還挺細(xì)。
利益相關(guān):Azul System的員工,參與Zing VM的研發(fā);之前在Oracle參與HotSpot VM的研發(fā)。
要說(shuō)主流JVM是什么,首先得區(qū)分清楚場(chǎng)景。
光談部署量的話(huà),搞不好現(xiàn)在部署量最多的JVM是Dalvik / ART…雖然Google會(huì)告訴大家Dalvik和ART不是“JVM”,但大家都知道骨子里它就是不折不扣的JVM,毫無(wú)疑問(wèn)。它們的設(shè)計(jì)處處有標(biāo)注對(duì)JVM規(guī)范的參考,以保證語(yǔ)義符合JVM規(guī)范的要求;那個(gè)基于寄存器的字節(jié)碼設(shè)計(jì)只是一種實(shí)現(xiàn)優(yōu)化而已。
Java SE / Java EEJava EE是以Java SE為基礎(chǔ)的。所以并沒(méi)有“JVM for Java EE”這么一說(shuō),只有“JVM for Java SE”,可以用于Java SE與Java EE。
在這個(gè)類(lèi)別下,主流選擇有:(按流行程度遞減)
HotSpot VM
HotSpot VM是絕對(duì)的主流。大家用它的時(shí)候很可能就沒(méi)想過(guò)還有別的選擇,或者是為了遷就依賴(lài)了Oracle/Sun JDK某些具體實(shí)現(xiàn)的爛代碼而選擇用HotSpot VM省點(diǎn)心。
Oracle / Sun JDK、OpenJDK的各種變種(例如IcedTea、Zulu),用的都是相同核心的HotSpot VM。
從Java SE 7開(kāi)始,HotSpot VM就是Java規(guī)范的“參考實(shí)現(xiàn)”(RI,Reference Implementation)。把它叫做“標(biāo)準(zhǔn)JVM”完全不為過(guò)。
Java Platform, Standard Edition 7 Reference ImplementationsJava Platform, Standard Edition 8 Reference Implementations
當(dāng)大家說(shuō)起“Java性能如何如何”、“Java有多少種GC”、“JVM如何調(diào)優(yōu)”云云,經(jīng)常默認(rèn)說(shuō)的就是特指HotSpot VM??梢?jiàn)其“主流性”。
(其實(shí)這不是件好事;具體到JVM實(shí)現(xiàn)才可以討論的問(wèn)題還是應(yīng)該指明討論是基于哪個(gè)實(shí)現(xiàn))
JDK8的HotSpot VM已經(jīng)是以前的HotSpot VM與JRockit VM的合并版,也就是傳說(shuō)中的“HotRockit”,只是產(chǎn)品里名字還是叫HotSpot VM。
這個(gè)合并并不是要把JRockit的部分代碼插進(jìn)HotSpot里,而是把前者一些有價(jià)值的功能在后者里重新實(shí)現(xiàn)一遍。移除PermGen、Java Flight Recorder、jcmd等都屬于合并項(xiàng)目的一部分。
不過(guò)要留意的是,這里我說(shuō)的HotSpot VM特指“正常配置”版,而不包括“Zero / Shark”版。Wikipedia那個(gè)頁(yè)面上把后者稱(chēng)為“Zero Port”。用這個(gè)版本的人應(yīng)該相當(dāng)少,很多時(shí)候它的release版都build不成功…
J9 VM
J9是IBM開(kāi)發(fā)的一個(gè)高度模塊化的JVM。
在許多平臺(tái)上,IBM J9 VM都只能跟IBM產(chǎn)品一起使用。這不是技術(shù)限制,而是許可證限制。
例如說(shuō)在Windows上IBM JDK不是免費(fèi)公開(kāi)的,而是要跟IBM其它產(chǎn)品一起捆綁發(fā)布的;使用IBM Rational、IBM WebSphere的話(huà)都有機(jī)會(huì)用到J9 VM(也可以自己選擇配置使用別的Java SE JVM)。
根據(jù)許可證,這種捆綁在產(chǎn)品里的J9 VM不應(yīng)該用于運(yùn)行別的Java程序…大家有沒(méi)有自己“偷偷的”拿來(lái)跑別的程序IBM也沒(méi)力氣管(咳咳
而在一些IBM的硬件平臺(tái)上,很少客戶(hù)是只買(mǎi)硬件不買(mǎi)配套軟件的,IBM給一整套解決方案,里面可能就包括了IBM JDK。這樣自然而然就用上了J9 VM。
所以J9 VM得算在主流里,雖然很少是大家主動(dòng)選擇的首選。
J9 VM的性能水平大致跟HotSpot VM是一個(gè)檔次的。有時(shí)HotSpot快些,有時(shí)J9
快些。
不過(guò)J9 VM有一些HotSpot VM在JDK8還不支持的功能,最顯著的一個(gè)就是J9支持AOT編譯和更強(qiáng)大的class data sharing。
Zing VM
我必須把自家的Zing VM放進(jìn)“主流”里 >_<
請(qǐng)參考之前我一個(gè)回答:
Azul Systems 是家什么樣的公司? - RednaxelaFX 的回答Zing VM是一個(gè)從Sun HoSpot VM fork出來(lái)的一個(gè)高性能JVM,可以運(yùn)行在Linux/x86-64平臺(tái)上。Azul為它重新寫(xiě)了一套GC,也修改了VM內(nèi)的許多實(shí)現(xiàn)細(xì)節(jié),所以從我們自己的角度看,與其說(shuō)它是HotSpot VM的一個(gè)變種,還不如把它看作“一個(gè)全新的JVM、只是湊巧與HotSpot VM很像”更合適。
在要求低延遲、快速預(yù)熱等的場(chǎng)景里,Zing VM都會(huì)比HotSpot VM表現(xiàn)更好。
Zing的C4 GC目前可以支持1TB的-Xmx,而且GC暫停時(shí)間仍然可以維持在< 10ms的范圍里。實(shí)際上Zing現(xiàn)在能支持接近2TB的-Xmx,但我們還沒(méi)能用來(lái)測(cè)試2TB場(chǎng)景的機(jī)器…據(jù)說(shuō)再過(guò)一段時(shí)間這個(gè)測(cè)試服務(wù)器就要到貨了。
Zing的ReadyNow!功能可以利用之前收集到的profile數(shù)據(jù),引導(dǎo)JVM在啟動(dòng)后快速達(dá)到穩(wěn)定的高性能水平,減少啟動(dòng)后從解釋執(zhí)行到JIT編譯的等待時(shí)間。
Zing自帶的ZVision / ZVRobot功能可以方便用戶(hù)監(jiān)控JVM的運(yùn)行狀態(tài),從找出代碼熱點(diǎn)到對(duì)象分配監(jiān)控、鎖競(jìng)爭(zhēng)監(jiān)控等都可以做到。
最關(guān)鍵的是,Zing能讓普通沒(méi)有為GC之類(lèi)的底層方向調(diào)優(yōu)的Java應(yīng)用享有低延遲、快速預(yù)熱、易于監(jiān)控的功能,為用戶(hù)節(jié)省苦苦調(diào)優(yōu)的精力和時(shí)間。這是Zing的主要價(jià)值——很多Java應(yīng)用都可以通過(guò)長(zhǎng)期努力在應(yīng)用/框架層面優(yōu)化來(lái)提升性能,但使用Zing的話(huà)就可以更多把精力集中在業(yè)務(wù)方面。
其它Java SE JVM
JRockit
以前Java SE的主流JVM中還有JRockit,跟HotSpot與J9一起并稱(chēng)三大主流JVM。這三家的性能水平基本都在一個(gè)水平上,競(jìng)爭(zhēng)很激烈。
自從Oracle把BEA和Sun都收購(gòu)了之后,Java SE JVM只能二選一,JRockit就炮灰了。
JRockit最后發(fā)布的大版本是R28,只到JDK6;原本在開(kāi)發(fā)中的R29及JDK7的對(duì)應(yīng)功能都沒(méi)來(lái)得及完成項(xiàng)目就被終止了。
http://IKVM.NET想在.NET上使用某些流行的Java庫(kù),或者干脆在.NET上運(yùn)行完整的Java程序不?
那
http://IKVM.NET是不二之選。
主流就說(shuō)這么幾個(gè)吧。其它支持Java SE的JVM還有好多,但是難說(shuō)是主流。
要比慘的話(huà),Apache Harmony里的DRLVM可能算是最慘之一。背后有IBM和Intel的強(qiáng)力支持,本來(lái)有望成為F/OSS系的主流JVM,奈何被Sun陰了一把不讓它跑JCK使它不能名正言順的使用Java?說(shuō)自己是符合規(guī)范的JVM;然后Sun自己趕緊開(kāi)源了自己的JDK,一直拖到硬把Harmony項(xiàng)目逼死了。
Java SE Embedded這是Oracle造出來(lái)的比較新的概念。硬件發(fā)展得很快,現(xiàn)在很多所謂“嵌入式”場(chǎng)景用的機(jī)器其實(shí)跟普通臺(tái)式機(jī)的配置沒(méi)差多少,完全足以運(yùn)行Java SE,侵蝕了以前高端Java ME(例如Java ME CDC Profile)的地盤(pán)。
Oracle Java SE Embedded里帶的JVM自然還是HotSpot VM,不過(guò)是Java SE Embedded定制版:簡(jiǎn)化了JVM內(nèi)的某些部件,盡可能在支持完整的Java SE功能的前提下向著減少內(nèi)存消耗的方向優(yōu)化;只留下了Client Compiler(C1)而去掉了Server Compiler(C2);GC以前好像是只留下了Serial GC但后來(lái)有沒(méi)有支持更多GC種類(lèi)我不太清楚。
IBM在這個(gè)領(lǐng)域照樣可以用J9 VM應(yīng)對(duì)。
其它還算主流Java SE Embedded JVM的話(huà),可能JamVM可以算進(jìn)來(lái)吧。它是一個(gè)小巧的、能支持完全OpenJDK類(lèi)庫(kù)和Java SE規(guī)范的JVM。
Java ME主流有倆:
CLDC-HI
Oracle/Sun系的話(huà),現(xiàn)在主流的Java ME JVM只有CLDC HotSpot Implementation(CLDC-HI,或者叫Monty VM)了。很明顯這是用于支撐Java ME CLDC Profile的JVM。
以前還有CDC HotSpot Implementation(CDC-HI,或者叫CVM),但Oracle調(diào)整了Java ME戰(zhàn)略之后這個(gè)VM也炮灰了。目前可能只有在Oracle ADF Mobile在iOS上的版本里還活著吧。(沒(méi)錯(cuò),iOS上可以跑Java程序的!)
戰(zhàn)略調(diào)整后的Java ME CLDC都快能趕上以前的Java ME CDC了。夾在Java ME CLDC與Java SE Embedded之間的Java ME CDC自然得炮灰。
Sun以前在Java ME CLDC還有一個(gè)KVM,本來(lái)應(yīng)該早就被CLDC-HI替代,但現(xiàn)在可能還有些小廠商在基于KVM定制自己的Java ME方案,畢竟更加簡(jiǎn)單而且資源消耗更少。
J9 VM
IBM在Java ME領(lǐng)域?qū)?yīng)的仍然是J9 VM。高度模塊化不是吹的。
Android / Android兼容系統(tǒng)如同開(kāi)頭說(shuō)的,Android上的Dalvik / ART雖然名字不叫JVM,但骨子里就是不折不扣的JVM。
這倆VM都能支持幾乎完整的Java SE功能。跟一般Java SE相比,可能也就ClassLoader、動(dòng)態(tài)生成字節(jié)碼之類(lèi)的方案比較坑爹。
Dalvik VM自身也有不少變種就是了。例如說(shuō)Intel版的Dalvik x86版重寫(xiě)了許多組件,JIT性能比原版Dalvik VM好。
阿里云OS的LemurVM是一個(gè)可以兼容Android的Java應(yīng)用的JVM。
JavaCardOracle/Sun有JCVM。其它支持JavaCard的JVM我還真沒(méi)怎么留意。會(huì)用到這種解決方案的都是政府或者企業(yè)用戶(hù)吧…不是我能接觸到的領(lǐng)域。
Sun SPOTSun SPOT上有個(gè)Squawk VM,是一個(gè)非常小巧、專(zhuān)門(mén)為小型嵌入式環(huán)境設(shè)計(jì)的JVM。
研究性質(zhì)的JVM去找比較新的、跟JVM相關(guān)的學(xué)術(shù)界的研究論文,基本上就下面幾個(gè)JVM可選:
- Jikes RVM
- Maxine VM
- Graal VM
這仨就算是現(xiàn)在的主流研究性JVM吧。
Jikes RVM
Jikes RVM是IBM開(kāi)發(fā)的專(zhuān)門(mén)用來(lái)研究JVM實(shí)現(xiàn)技術(shù)的項(xiàng)目。曾用名Jalape?o。
它是一個(gè)元循環(huán)虛擬機(jī)(metacircular VM),整個(gè)JVM都是用Java實(shí)現(xiàn)的。
最有趣的地方是它有一個(gè)名為MMTk的框架:
Jikes RVM - MMTk,可以很方便的編寫(xiě)新的GC算法插入到Jikes RVM里去,而且已有的實(shí)現(xiàn)的選擇也很豐富。所以很多研究GC算法的論文會(huì)選擇基于Jikes RVM/MMTk來(lái)做初步實(shí)現(xiàn),不但做起來(lái)容易,還可以很方便的與別的算法對(duì)比。
Maxine VM
Maxine VM是Oracle/Sun Labs開(kāi)發(fā)的研究項(xiàng)目。跟Jikes RVM一樣是元循環(huán)虛擬機(jī)。
Maxine VM自從有了C1X/T1X編譯器之后,性能似乎就超過(guò)了Jikes RVM;有了Graal編譯器之后更加壓倒Jikes RVM。做JIT編譯器研究的話(huà)我會(huì)選擇用Maxine VM。
Graal VM
Graal VM就是Maxine VM的Graal編譯器插在HotSpot VM上。現(xiàn)在Oracle Labs和一些大學(xué)做JIT編譯器研究都是基于Graal VM來(lái)做的,效果出奇的好,性能基本跟HotSpot Server Compiler(C2)持平甚至有所超越。勢(shì)頭正猛。
以前百家爭(zhēng)鳴的時(shí)候,研究性JVM或配套的JIT編譯器那也是多得要命。ORP、OpenJIT、Moxie、Joeq、CACAO、SableVM、VMKit、Sun ExactVM / ResearchVM…隨便列幾個(gè)。
想對(duì)JVM考古的話(huà),歡迎來(lái)參考我以前發(fā)的帖里的列表:
歡迎來(lái)到高級(jí)語(yǔ)言虛擬機(jī)圈子
先寫(xiě)這么多。想多知道點(diǎn)啥的話(huà)歡迎在評(píng)論提。