jvm 种类
Wikipedia那個Comparison of Java virtual machines頁面給JVM實現分得還挺細。
Java SE / Java EE
Java EE是以Java SE為基礎的。所以并沒有“JVM for Java EE”這么一說,只有“JVM for Java SE”,可以用于Java SE與Java EE。
在這個類別下,主流選擇有:(按流行程度遞減)- HotSpot VM
- J9 VM
- Zing VM
HotSpot VM
HotSpot VM是絕對的主流。大家用它的時候很可能就沒想過還有別的選擇,或者是為了遷就依賴了Oracle/Sun JDK某些具體實現的爛代碼而選擇用HotSpot VM省點心。
Oracle / Sun JDK、OpenJDK的各種變種(例如IcedTea、Zulu),用的都是相同核心的HotSpot VM。
從Java SE 7開始,HotSpot VM就是Java規范的“參考實現”(RI,Reference Implementation)。把它叫做“標準JVM”完全不為過。
當大家說起“Java性能如何如何”、“Java有多少種GC”、“JVM如何調優”等等,經常默認說的就是特指HotSpot VM??梢娖洹爸髁餍浴?。
(其實這不是件好事;具體到JVM實現才可以討論的問題還是應該指明討論是基于哪個實現)
JDK8的HotSpot VM已經是以前的HotSpot VM與JRockit VM的合并版,也就是傳說中的“HotRockit”,只是產品里名字還是叫HotSpot VM。
這個合并并不是要把JRockit的部分代碼插進HotSpot里,而是把前者一些有價值的功能在后者里重新實現一遍。移除PermGen、Java Flight Recorder、jcmd等都屬于合并項目的一部分。
不過要留意的是,這里我說的HotSpot VM特指“正常配置”版,而不包括“Zero / Shark”版。Wikipedia那個頁面上把后者稱為“Zero Port”。用這個版本的人應該相當少,很多時候它的release版都build不成功…
J9 VM
J9是IBM開發的一個高度模塊化的JVM。
在許多平臺上,IBM J9 VM都只能跟IBM產品一起使用。這不是技術限制,而是許可證限制。
例如說在Windows上IBM JDK不是免費公開的,而是要跟IBM其它產品一起捆綁發布的;使用IBM Rational、IBM WebSphere的話都有機會用到J9 VM(也可以自己選擇配置使用別的Java SE JVM)。
根據許可證,這種捆綁在產品里的J9 VM不應該用于運行別的Java程序,但是大家自己“偷偷的”拿來跑別的程序,IBM也沒力氣管。而在一些IBM的硬件平臺上,很少客戶是只買硬件不買配套軟件的,IBM給一整套解決方案,里面可能就包括了IBM JDK。這樣自然而然就用上了J9 VM。所以J9 VM得算在主流里,雖然很少是大家主動選擇的首選。
J9 VM的性能水平大致跟HotSpot VM是一個檔次的。有時HotSpot快些,有時J9快些。不過J9 VM有一些HotSpot VM在JDK8還不支持的功能,最顯著的一個就是J9支持AOT編譯和更強大的class data sharing。
Zing VM
我必須把自家的Zing VM放進“主流”里 。
Azul Systems是一家專門致力于高性能、可管理的Java及JVM系統的公司,主要服務對實時性要求高的行業。
它在2002年成立于Menlo Park。目前總部位于Sunnyvale, California。研發和測試主要在三個地點:Sunnyvale總部、印度辦公室和俄羅斯的圣彼得堡辦公室。研發+測試團隊大概60人,是個傳統意義上的小公司。
Azul已經連續幾年被選為JCP執行委員會成員。
Zing的C4 GC目前可以支持1TB的-Xmx,而且GC暫停時間仍然可以維持在< 10ms的范圍里。實際上Zing現在能支持接近2TB的-Xmx,但我們還沒能用來測試2TB場景的機器…據說再過一段時間這個測試服務器就要到貨了。
Zing的ReadyNow!功能可以利用之前收集到的profile數據,引導JVM在啟動后快速達到穩定的高性能水平,減少啟動后從解釋執行到JIT編譯的等待時間。
Zing自帶的ZVision / ZVRobot功能可以方便用戶監控JVM的運行狀態,從找出代碼熱點到對象分配監控、鎖競爭監控等都可以做到。
其它Java SE JVM
JRockit
以前Java SE的主流JVM中還有JRockit,跟HotSpot與J9一起并稱三大主流JVM。這三家的性能水平基本都在一個水平上,競爭很激烈。
自從Oracle把BEA和Sun都收購了之后,Java SE JVM只能二選一,JRockit就炮灰了。JRockit最后發布的大版本是R28,只到JDK6;原本在開發中的R29及JDK7的對應功能都沒來得及完成項目就被終止了。
想在.NET上使用某些流行的Java庫,或者干脆在.NET上運行完整的Java程序不?那http://IKVM.NET是不二之選。
主流就說這么幾個吧。其它支持Java SE的JVM還有好多,但是難說是主流。
要比慘的話,Apache Harmony里的DRLVM可能算是最慘之一。背后有IBM和Intel的強力支持,本來有望成為F/OSS系的主流JVM,奈何被Sun狠狠的捅了一刀,不讓它跑JCK;使它不能名正言順的使用Java?,更不能說自己是符合規范的JVM。然后Sun自己趕緊開源了自己的JDK,一直拖到硬把Harmony項目逼死了。
Java SE Embedded
這是Oracle造出來的比較新的概念。硬件發展得很快,現在很多所謂“嵌入式”場景用的機器其實跟普通臺式機的配置沒差多少,完全足以運行Java SE,侵蝕了以前高端Java ME(例如Java ME CDC Profile)的地盤。
Oracle Java SE Embedded里帶的JVM自然還是HotSpot VM,不過是Java SE Embedded定制版:簡化了JVM內的某些部件,盡可能在支持完整的Java SE功能的前提下向著減少內存消耗的方向優化;只留下了Client Compiler(C1)而去掉了Server Compiler(C2);GC以前好像是只留下了Serial GC但后來有沒有支持更多GC種類。
IBM在這個領域照樣可以用J9 VM應對。
其它還算主流Java SE Embedded JVM的話,可能JamVM可以算進來吧。它是一個小巧的、能支持完全OpenJDK類庫和Java SE規范的JVM。
Java ME
主流有倆:- CLDC-HI
- J9 VM
CLDC-HI
Oracle/Sun系的話,現在主流的Java ME JVM只有CLDC HotSpot Implementation(CLDC-HI,或者叫Monty VM)了。很明顯這是用于支撐Java ME CLDC Profile的JVM。
以前還有CDC HotSpot Implementation(CDC-HI,或者叫CVM),但Oracle調整了Java ME戰略之后這個VM也炮灰了。目前可能只有在Oracle ADF Mobile在iOS上的版本里還活著吧。(沒錯,iOS上可以跑Java程序的!基于iOS的JVM,這個是不是讓你有點驚訝?)
戰略調整后的Java ME CLDC都快能趕上以前的Java ME CDC了。夾在Java ME CLDC與Java SE Embedded之間的Java ME CDC自然成了炮灰。
Sun以前在Java ME CLDC還有一個KVM,本來應該早就被CLDC-HI替代,但現在可能還有些小廠商在基于KVM定制自己的Java ME方案,畢竟更加簡單而且資源消耗更少。
J9 VM
IBM在Java ME領域對應的仍然是J9 VM。高度模塊化!
Android / Android兼容系統
如同開頭說的,Android上的Dalvik / ART雖然名字不叫JVM,但骨子里就是不折不扣的JVM。
這倆VM都能支持幾乎完整的Java SE功能。跟一般Java SE相比,可能也就ClassLoader、動態生成字節碼之類的方案比較坑。
Dalvik VM自身也有不少變種就是了。例如說Intel版的Dalvik x86版重寫了許多組件,JIT性能比原版Dalvik VM好。
阿里云OS的LemurVM是一個可以兼容Android的Java應用的JVM。
JavaCard
Oracle/Sun有JCVM。其它支持JavaCard的JVM我還真沒怎么留意。會用到這種解決方案的都是政府或者企業用戶吧…不是我能接觸到的領域。
Sun SPOT
Sun SPOT上有個Squawk VM,是一個非常小巧、專門為小型嵌入式環境設計的JVM。
研究性質的JVM
去找比較新的、跟JVM相關的學術界的研究論文,基本上就下面幾個JVM可選:- Jikes RVM
- Maxine VM
- Graal VM
這仨就算是現在的主流研究性JVM吧。
Jikes RVM
Jikes RVM是IBM開發的專門用來研究JVM實現技術的項目。曾用名Jalape?o。
它是一個元循環虛擬機(metacircular VM),整個JVM都是用Java實現的。
最有趣的地方是它有一個名為MMTk的框架:Jikes RVM - MMTk,可以很方便的編寫新的GC算法插入到Jikes RVM里去,而且已有的實現的選擇也很豐富。所以很多研究GC算法的論文會選擇基于Jikes RVM/MMTk來做初步實現,不但做起來容易,還可以很方便的與別的算法對比。
Maxine VM
Maxine VM是Oracle/Sun Labs開發的研究項目。跟Jikes RVM一樣是元循環虛擬機。
Maxine VM自從有了C1X/T1X編譯器之后,性能似乎就超過了Jikes RVM;有了Graal編譯器之后更加壓倒Jikes RVM。做JIT編譯器研究的話我會選擇用Maxine VM。
Graal VM
Graal VM就是Maxine VM的Graal編譯器插在HotSpot VM上?,F在Oracle Labs和一些大學做JIT編譯器研究都是基于Graal VM來做的,效果出奇的好,性能基本跟HotSpot Server Compiler(C2)持平甚至有所超越。勢頭正猛。
以前百家爭鳴的時候,研究性JVM或配套的JIT編譯器那也是多得要命。ORP、OpenJIT、Moxie、Joeq、CACAO、SableVM、VMKit、Sun ExactVM / ResearchVM…(隨便列幾個)。
總結
- 上一篇: 怎样下载歌曲到u盘里?
- 下一篇: 仿jquery 编写自己的js库