免费,快速,开放,经过生产验证和所有Java:OpenJ9

Free, Fast, Open, Production-Proven, and All Java: OpenJ9

本文在新的DZone Java指南中进行了介绍:功能,改进和更新。 免费获得更多有见地的文章,行业统计信息以及更多内容的副本!

Eclipse OpenJ9是一种高性能,可扩展的Java虚拟机(JVM)实现。 这不是新的。 多年来,它一直是IBM Java Development Kit的一部分,可以肯定地说,它是许多基于Java的大型系统的企业级,生产级组件。 去年年底,它由IBM贡献给Eclipse Foundation。 OpenJ9是目前在OpenJDK中最常用的Hotspot JVM的替代产品。

历史沿革

尽管Eclipse OpenJ9项目已经存在很长时间了,但是VM本身已经存在了很多年。 它是在第四JavaOne期间启动的,部分代码库可以追溯到Smalltalk。

在过去十年或更长时间里,它一直在为IBM中间件产品提供动力。 IBM于2017年底向Eclipse Foundation提供了VM,并且有70多个IBM开发人员积极参与了该项目。

Eclipse OpenJ9项目的长期目标是建立一个JVM开发人员开放的生态系统,该系统可以与硬件平台,操作系统,工具和框架的设计人员和开发人员进行协作和创新。 通过使JVM规范的多个实现相互竞争以为您的应用程序提供最佳运行时,Java社区从其历史中受益。 无论是添加压缩参考,新的云功能,AOT(提前)编译,还是提高性能和降低内存使用量,生态系统都通过竞争而得到了改善。 Eclipse OpenJ9旨在继续推动运行时领域的创新。

作为此过程的重要组成部分,团队与由伦敦Java社区牵头的AdoptOpenJDK紧密合作。 如果仔细观察,您会发现OpenJ9的很大一部分已经在Eclipse Foundation工作了两年。 Eclipse OpenJ9嵌入了Eclipse OMR,它提供了跨平台组件,用于构建可靠的高性能语言运行时。

Eclipse OpenJ9采用了OMR,并添加了额外的代码,将其转变为Java应用程序的运行时环境。

到底什么才是OpenJ9,它与OpenJDK有什么关系?

OpenJ9替代了OpenJDK构建中的HotSpot JVM,并成为可与各种系统体系结构和操作系统一起使用的新JVM运行时实现。 当前,可以通过AdopOpenJDK项目网站使用OpenJ9作为JVM来构建Java版本8、9和10的预构建OpenJDK二进制文件。 JVM并不是完整的Java开发工具包(JDK)。 它是执行引擎。 尽管JDK提供了工具,类库以及构建应用程序所需的更多常规内容,但JVM负责运行实际的字节码。 它替代了由Oracle实现的常用和已知的Hotspot JVM。

为了使用OpenJ9作为JVM创建OpenJDK构建,将OpenJDK项目镜像到一个单独的存储库中,该存储库删除Hotspot并为所需的集成代码提供了一个位置。 集成代码主要包括对Makefile和配置的更改,对类库代码(JCL)的一些补丁,以及一些针对其他OpenJ9功能的次要补丁。

集成层缓解了Hotspot和OpenJ9的界面略有不同的少数地方。 总而言之,它大约有4000行代码,与OpenJ9或OpenJDK的大小相比确实很小。 主要目标是将其保持在必要的最低限度,并在OpenJDK的上游做出尽可能多的贡献。

Image title

使用OpenJDK,并通过构建过程将集成代码和OpenJ9结合在一起,最终结果是二进制文件,可用于各种不同的平台。

您可以在项目网站上找到有关构建过程以及如何使用OpenJ9来构建自己的OpenJDK的更多信息。

为什么OpenJ9是完美的云运行时

如今,云运行时的要求不同于几年前数据中心中各个物理机所采用的特性。 较小的内存占用空间可为提供程序提供更高的应用程序密度,并为用户减少每个应用程序的成本,因为他们可以使用更少的资源运行更多实例。

另一个重要功能是快速启动,它可以使应用程序实例更快,更流畅地扩展。

OpenJ9项目使用Daytrader应用程序监视与Hotspot相比的性能改进。 启动后内存占用空间减少了66%,启动时间缩短了42%,在诸如Docker容器这样的约束环境中,它可以达到相当的吞吐量。

独特的功能和优势

与传统的Hotspot JVM相比,较低的内存占用量和更快的启动时间证明了某些优势和实现差异的实际影响。

应用程序类别共享和AOT编译

首次运行应用程序时,JVM必须加载启动该应用程序所需的所有类。 此过程需要时间。 如果将所需的类存储在缓存中,则第二个应用程序的运行将更快。 另一个实现方面的区别是,JVM不存储Java字节码类,而是存储它的优化的ROMClass版本。 这些只读的,优化的版本仅携带符号数据。 JVM执行一个类时,它必须能够进行一堆查找,例如 找到它实际调用的方法,并且还需要能够处理数据并保存该数据。 这是J9RAMClass出现的地方。它是运行时数据的缓存,并承载特定类的实时数据。

此外,可以在同一台计算机上的多个JVM之间共享ROMClass。 OpenJ9始终共享默认系统类加载器加载的引导程序类和应用程序类。 本文提供了有关其工作原理的详细视图。 使用此共享类缓存提前编译(AOT),还有其他可以优化的地方。 与即时(JIT)编译不同,AOT在运行时将方法动态编译为ATO代码,并将这些ROMClass放入共享缓存中。 VM会根据启发式方法自动选择应进行AOT编译的方法,这些方法可识别大型应用程序的启动阶段。 它是通过-Xshareclasses选项启用的,该选项是高度可配置的。

至于AOT本身,当您启用共享类时,它可以直接使用,并且不需要任何特殊的调整。

调整云环境

-Xtune:virtualized选项设计用于针对典型的云部署配置OpenJ9,在典型的云部署中,为VM guest虚拟机配置了少量的虚拟CPU,以最大化可运行的应用程序数量。 -Xquickstart选项可实现OpenJ9的超快速启动,并且最适合短期任务。 但是请注意,您可能会牺牲峰值吞吐量功能。 您也可以在命令行上指定-XX:+ IdleTuningGcOnIdle。 设置后,OpenJ9会根据CPU利用率和其他内部启发式信息确定应用程序是否处于空闲状态。 识别为空闲状态后,如果堆中有大量垃圾,则会运行GC周期,并将未使用的内存释放回操作系统。 本文提供了更详细的概述。

OpenJ9中的垃圾回收

Eclipse OpenJ9具有许多针对不同类型的应用程序和工作负载设计的GC策略。 世代并发(-Xgcpolicy:gencon)GC策略是JVM使用的默认策略。 但是还有其他四个选择:-Xgcpolicy:平衡的,-Xgcpolicy:节拍器,-Xgcpolicy:optavgpause和-Xgcpolicy:optthruput。 如果您的应用程序依赖于精确的响应时间并且您正在x86 Linux上运行,那么节拍器GC(-Xgcpolicy:metronome)策略特别有趣。 Metronome与其他策略之间的主要区别在于,垃圾收集是通过小的可中断步骤进行的,而不是在标记和收集垃圾时完全停止了应用程序。

默认情况下,节拍器一次暂停三毫秒。 一个完整的垃圾回收周期需要许多暂停,这些暂停会分散开来,以使应用程序有足够的时间运行。 您可以限制GC进程使用的CPU数量,还可以控制暂停时间。 可以在本文中找到有关各个策略的更完整概述。

开始使用

AdoptOpenJDK项目发布了针对Linux x64,Linux s390x,Linux ppc64和AIX ppc64的预构建二进制文件。 最简单的入门方法是为您的操作系统下载一个并开始使用它-尽管您可以自己为其他平台(例如Linux ARMv7)构建二进制文件。 Docker映像可通过DockerHub获得。

JVM文档内容丰富且结构合理,可帮助您开始优化应用程序。

本文在新的DZone Java指南中进行了介绍:功能,改进和更新。 免费获得更多有见地的文章,行业统计信息以及更多内容的副本!