JVM的种类

转载 2018-06-30 14:46 阅读(170)次

    JVM的种类

转自 CSDN, https://blog.csdn.net/lxlmycsdnfree/article/details/69286099
作者:lxlmycsdnfree
如有不妥,请联系我删除,我删除掉了一些太冷门的内容大笑,补了我的一些废话,见谅。

JVM是JAVA虚拟机,有固定的标准规范,各家厂商只要遵循这个标准,是可以实现自己的JVM。


HotSpot VM


现在常见的都是HotSpot VM,因为他是最常见的JDK(Oracle / Sun JDK、OpenJDK)都使用的VM。而绝大多数java coder都使用这两种JDK。

从Java SE 7开始,HotSpot VM就是Java规范的“参考实现”(RI,Reference Implementation)。把它叫做“标准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在业界也是一个强大的存在。而且他们往往不愿意用别人家的东西,所以写一个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得算在主流里,虽然很少是大家主动选择的首选。(这可能是因为IBM的东西太贵了,我只在第一家公司---国企,听说过有人用。)

J9 VM的性能水平大致跟HotSpot VM是一个档次的。有时HotSpot快些,有时J9快些。不过J9 VM有一些HotSpot VM在JDK8还不支持的功能,最显著的一个就是J9支持AOT编译和更强大的class data sharing。

原作者在文中介绍了Zing VM,但确实了解不多,内容我暂时略过了。Zing VM是一个从Sun HoSpot VM fork出来的一个高性能JVM,可以运行在Linux/x86-64平台上。Azul为它重新写了一套GC,也修改了VM内的许多实现细节。

     JRockit


以前Java SE的主流JVM中还有JRockit,跟HotSpot与J9一起并称三大主流JVM。这三家的性能水平基本都在一个水平上,竞争很激烈。
自从Oracle把BEA和Sun都收购了之后,Java SE JVM只能二选一,JRockit就炮灰了。JRockit最后发布的大版本是R28,只到JDK6;原本在开发中的R29及JDK7的对应功能都没来得及完成项目就被终止了。


     Java SE Embedded

Java SE Embedded定制版:简化了JVM内的某些部件,尽可能在支持完整的Java SE功能的前提下向着减少内存消耗的方向优化;只留下了Client Compiler(C1)而去掉了Server Compiler(C2);GC以前好像是只留下了Serial GC但后来有没有支持更多GC种类。

Android Dalvik 

如同开头说的,Android上的Dalvik / ART虽然名字不叫JVM,但骨子里就是不折不扣的JVM。
这俩VM都能支持几乎完整的Java SE功能。跟一般Java SE相比,可能也就ClassLoader、动态生成字节码之类的方案比较坑

本文完。