当前位置: 首页 > news >正文

IBM开源JVM实现OpenJ9,并提交Eclipse基金会托管

近日,IBM将其J9 Java 虚拟机命名为OpenJ9,托管至Eclipse基金会并在GitHub上开源,OpenJ9的定位是企业级的开源Java虚拟机。

\\

在2006年9月20旧金山举办的JavaOne上,IBM就曾宣布开源其Java虚拟机OpenJ9,该项目的领导者Dan Heidinga做过J9相关的技术演讲,阐述了该虚拟机的技术架构和相关的生态系统。当时,IBM计划随Java 9一起开源其OpenJ9。根据Dan Heidinga的描述,OpenJ9的核心价值在于高性能、高可用性和适用性。OpenJ9的技术架构如下所示:

\\

0120ff2a7efd6a1ba43bc546a2eba838.png

\\

为了实现性能的提升,OpenJ9在数据结构、类加载、线程管理、解释器等方面都进行了优化。按照IBM的规划,OpenJ9与Eclipse OMR的关系如下图所示:

\\

f6b9553e397d27bcf9a5a9c9e1d586cc.png

\\

其中,Eclipse OMR是用于构建可靠、高性能语言运行时的跨平台组件。这组件使用C和C++编写,借助它能够构建跨不同硬件和操作系统平台的语言运行时,该项目也在GitHub开源。根据RednaxelaFX的解读,OMR是最上游,OpenJ9基于OMR构建出一个完整的JVM,OpenJ9 + OpenJDK Java Class Library构成出一个完整的Java运行时环境,然后在此基础上添加IBM的特化功能最终构成IBM发行版J9及其配套库。

\\

关于公众可能关注的问题,Eclipse OpenJ9在官网上进行了回应 。

\\

Eclipse OpenJ9 是 OpenJDK 的替代方案吗?

\\
\

不是。Eclipse OpenJ9 是一个 Java 虚拟机(JVM),也就是运行 Java 应用程序的引擎,而 OpenJDK 是一个完整的开发工具包,除了JVM还包含其他的组件比如Java类库。默认情况下,OpenJDK 使用名为 Hotspot 的 JVM进行构建。简单来说,OpenJ9 是JVM的替代方案,可将其包含到 OpenJDK的二进制文件中。

\
\\

Eclipse OpenJ9与Hotspot 的差别在哪里?

\\
\

Hotspot 和 Eclipse OpenJ9 都是可以包含在 OpenJDK中的 Java 虚拟机,但它们具有不同的功能。按照不同的构建过程,你可以让OpenJDK二进制文件中包含 Eclipse OpenJ9 ,也可以包含 Hotspot。

\
\\

OpenJ9中的J9代表什么含义呢?

\\
\

为了澄清公众的误解,J9 != Java 9。如果读者对它名字的来源感兴趣的话,可以参考这篇博客文章。

\
\\

既然如此,我们为什么要使用 Eclipse OpenJ9 而不是默认的 JVM呢?

\\
\

如果你正在为应用程序寻找企业级的运行时环境,那么建议使用 Eclipse OpenJ9 构建 OpenJDK。这个高性能、可扩展的虚拟机是众多 IBM 企业软件产品的核心。你还可以进一步地优化OpenJ9,提升特定场景下Java应用的性能。

\
\\

为什么 IBM 将他们的 J9 虚拟机贡献给了 Eclipse 基金会?

\\
\

IBM 公开承诺要将创新带入开源开发社区。多年以来,J9虚拟机是Java版IBM SDK的核心,将它开源,阐明了IBM的兑现承诺的决心。
\OpenJ9 虚拟机构建在 Eclipse OMR 项目的核心技术之上,OMR 是由 IBM 在 2016 年贡献给 Eclipse 基金会的。IBM 持续地投入资源到Eclipse OpenJ9 和 Eclipse OMR项目中,以确保企业级产品能够利用最新的硬件技术。

\
\\

OpenJ9的网站上提供了预构建版本的下载地址(通过AdoptOpenJDK下载)以及自行打包构建的完整教程。OpenJ9本身对Java应用进行了一些优化,我们无需再调整命令行选项。如果你想配置不同的垃圾收集器或者要探索特定硬件的特性的话(比如GPU),那么可以读取IBM知识中心上已有的用户文档。

\\

OpenJ9的关注点主要在性能方面,因此Phoronix Media站点的创始人Michael Larabel运行了一些快速的基准(Benchmark)测试,以了解OpenJ9和Hotspot之间性能的差异。

\\

在测试中,他分别使用了将OpenJ9打包至OpenJDK 9的构建版本以及当时的OpenJDK 9 Hotspot构建版本(作者在进行测试时,正式版本的Java 9尚未发布——编者注),作为参考,还使用了OpenJDK 8 Hotspot构建版本。这三个JDK都可以通过AdoptOpenJDK站点获取预先构建好的版本。

\\

Michael使用两台Linux机器进行了快速的基准测试,其中一台机器的处理器是Intel Core i9 7900X,操作系统是基于Linux 4.13 kernel的Ubuntu 17.04。另外一台机器是双插槽 Tyan 服务器,处理器是Xeon Gold 6138,操作系统是Debian GNU/Linux 9.1。每台机器上都使用这三个OpenJDK进行了测试,有一些Java基准测试是通过Phoronix Test Suite运行的。

\\

首先看一下Core i9 7900X机器的结果。Michael先在这三个OpenJDK上执行了j2dbench测试,这是一个关注图形处理的基准测试。在使用OpenJ9时,文本渲染的速度明显比较慢,而在另外两个基准测试中,它与OpenJDK性能差别不大。OpenJDK 8和9本身的差别也不大。该测试结果如下图所示:

\\

b06e8b0e93e2eaf0fd00e646e2d16d19.png

\\

同时,他还运行Java版本的SciMark2进行一些数学相关的基准测试,结果如下:

\\

9bc4f0b901dcc4c932a89a7513ac0cb9.png

\\

01902c2bd71a2af082d6385c22f05b40.jpg

\\

至少就目前来看,OpenJ9的性能要比较明显地落后于Hotspot。

\\

在基于Java的Bork文件加密方面,Hotspot也更快:

\\

6df0e6fb08be750c58bdaae62d1b2941.png

\\

在这些测试版本中,JMH的性能表现也非常类似:

\\

d5aeb622286b68ae75acc6514048e87a.png

\\

在双插槽的Xeon Gold Tyan服务器上,Hotspot/OpenJ9的基准测试结果非常类似,可以参考该文了解详细结果。

\\

OpenJ9是一个非常新的JVM项目,几个月之后再来评估它的性能也许更合理一些。在这篇性能对比文章的评论区,有些读者发表了一些有价值的评论。有人认为,不应该像使用OpenJDK那样使用J9,JVM的调优知识对于性能改善至关重要。J9针对x86架构可能还不太成熟,或者需要一些配置选项。J9最初是针对大规模System-Z机器上的应用设计的,因此它需要时间来对JVM进行预热,从而确定哪些字节码需要进行优化,这个“分析器”需要根据应用的运行来进行调整。如果要在x86计算机或小型设备上运行J9的话,毫无疑问需要调整一些JVM的配置。

\\

随着OpenJ9开源资料的完善,我们会对这个JVM有更多的了解,相信它也会对整个Java社区的发展增加新的推动力。

\\

感谢郭蕾对本文的审校。

\\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。

相关文章:

  • Exchange2007 Web/Outlook邮箱界面语言设定
  • SAP发布wbservice,如果有权限管控的话,需要给这个webservice加权限
  • GDB 常用命令 ***
  • CSDN博客备份2
  • mysql面试题分组并合并列
  • 男人不成熟35个标志
  • 虚机cbt
  • 多线程博文地址 http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html
  • DotNET企业架构应用实践-系统架构与性能-理论依据及相关技术
  • python里的拆包、引用、递归与匿名函数
  • Android API 中文 (52) —— ZoomButtonsController.OnZoomListener
  • 电子商务的云计算应用是一片蓝海
  • 设计模式 - 总结篇
  • mysql 案例~select引起的性能问题
  • 研究NIO时的柳暗花明
  • 77. Combinations
  • Angular4 模板式表单用法以及验证
  • C++类中的特殊成员函数
  • ES6简单总结(搭配简单的讲解和小案例)
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • 闭包,sync使用细节
  • 记录:CentOS7.2配置LNMP环境记录
  • 聊聊hikari连接池的leakDetectionThreshold
  • 浅谈Golang中select的用法
  • 深度学习在携程攻略社区的应用
  • 深入浅出webpack学习(1)--核心概念
  • 微信小程序--------语音识别(前端自己也能玩)
  • 为什么要用IPython/Jupyter?
  • 在Mac OS X上安装 Ruby运行环境
  • Nginx实现动静分离
  • 从如何停掉 Promise 链说起
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • (1)STL算法之遍历容器
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (九)信息融合方式简介
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (一)基于IDEA的JAVA基础12
  • (译) 函数式 JS #1:简介
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .Net 8.0 新的变化
  • .Net6 Api Swagger配置
  • .NET导入Excel数据
  • .NET连接数据库方式
  • .Net小白的大学四年,内含面经
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @开发者,一文搞懂什么是 C# 计时器!
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C# 网络编程系列]专题六:UDP编程
  • [Contest20180313]灵大会议
  • [hdu 2826] The troubles of lmy [简单计算几何 - 相似]
  • [IE编程] IE8的SDK 下载
  • [Java]快速入门优先队列(堆)手撕相关面试题
  • [JavaWeb]—前端篇