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执行委员会成员。

Azul的产品都是符合Java规范的运行系统。当前的两款主打产品都是JDK,可以作为标准JDK(如Oracle JDK)的直接替代品:
  1. Zing。这是Azul传统风格的产品,主打低延迟、高实时服务器端JDK市场。它以Sun的HotSpot VM为基础,改进了许多会影响延迟的细节。最大的三个卖点是:(1) 低延迟、“无暂停”(pauseless)的C4 GC,GC带来的暂停可以控制在10ms以下的级别,支持的Java堆大小可以到1TB(2016年更新:目前已经支持到2TB的Java堆啦);(2) 启动后快速预热功能,“ReadyNow!”;(3) 可管理性:零开销、可在生产环境全时开启的、整合在JVM内的监控工具Zing Vision。Zing(外加Zing System Tools)是一个纯软件解决方案,可以运行在Linux/x86-64平台上。
  2. Zulu。这是2013年开始摸索的新产品。它是Azul提供商业支持的OpenJDK商业发行版,力争维持与Oracle JDK的高度一致性,并为其提供态度非常好、价廉物美的商业支持。Zulu有JDK6、JDK7、JDK8的发行版,支持在x86上的Windows / Linux / Mac OS X。Zulu还有Docker支持
Zing VM是一个从Sun HoSpot VM fork出来的一个高性能JVM,可以运行在Linux/x86-64平台上。Azul为它重新写了一套GC,也修改了VM内的许多实现细节,所以从我们自己的角度看,与其说它是HotSpot VM的一个变种,还不如把它看作“一个全新的JVM、只是凑巧与HotSpot VM很像。在要求低延迟、快速预热等的场景里,Zing VM都会比HotSpot VM表现更好。

Zing的C4 GC目前可以支持1TB的-Xmx,而且GC暂停时间仍然可以维持在< 10ms的范围里。实际上Zing现在能支持接近2TB的-Xmx,但我们还没能用来测试2TB场景的机器…据说再过一段时间这个测试服务器就要到货了。
Zing的ReadyNow!功能可以利用之前收集到的profile数据,引导JVM在启动后快速达到稳定的高性能水平,减少启动后从解释执行到JIT编译的等待时间。
Zing自带的ZVision / ZVRobot功能可以方便用户监控JVM的运行状态,从找出代码热点到对象分配监控、锁竞争监控等都可以做到。

最关键的是,Zing能让普通没有为GC之类的底层方向调优的Java应用享有低延迟、快速预热、易于监控的功能,为用户节省苦苦调优的精力和时间。这是Zing的主要价值——很多Java应用都可以通过长期努力在应用/框架层面优化来提升性能,但使用Zing的话就可以更多把精力集中在业务方面。

其它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程序不?那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上。现在Oracle Labs和一些大学做JIT编译器研究都是基于Graal VM来做的,效果出奇的好,性能基本跟HotSpot Server Compiler(C2)持平甚至有所超越。势头正猛。

以前百家争鸣的时候,研究性JVM或配套的JIT编译器那也是多得要命。ORP、OpenJIT、Moxie、Joeq、CACAO、SableVM、VMKit、Sun ExactVM / ResearchVM…(随便列几个)。



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JVM中常用的垃圾回收算法有四种:标记清除算法、复制算法、标记整理算法和分代收集算法。 标记清除算法通过先标记出所有活动对象,然后清除掉未被标记的对象。 复制算法将内存空间分为两个相等的部分,每次只使用其中一个部分存储活动对象,当这部分内存满时,将存活的对象复制到另一部分,再清除当前部分的所有对象。标记整理算法是在标记阶段之后,将所有活动对象向一端移动,然后清除掉末尾的无效内存。 分代收集算法是基于对象存活时间的不同,将堆内存划分为不同的代,不同代使用不同的垃圾回收算法。 [1][2<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JVM中常用的垃圾回收算法](https://blog.csdn.net/qq_42640067/article/details/114460423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Java中的常见JVM垃圾收集算法](https://blog.csdn.net/weixin_43767015/article/details/105240846)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [【详解】JVM——垃圾回收算法大全](https://blog.csdn.net/qq_43040688/article/details/105004281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值