阿里开源 Dragonwell JDK 重磅发布 GA 版本:生产环境可用

2023-10-30

今年 3 月份,阿里巴巴重磅开源 OpenJDK 长期支持版本 Alibaba Dragonwell 的消息,在很长一段时间内都是开发者的讨论焦点,该项目在 Github 上的 Star 数迅速突破 1400。近日,Dragonwell JDK 8.0.0 正式发布 GA 版本,这意味着其已经具备在生产环境正式运行的能力。


2019 年 3 月,Dragonwell JDK正式开源,发布预览 (Preview) 版本。近日,阿里巴巴重磅宣布 Dragonwell JDK 8.0.0-GA 正式发布,这意味着 Dragonwell JDK 已经完全具备在生产环境运行的能力。在过去三个月时间内,Dragonwell 收到了很多来自社区成员的反馈。那么,本次正式发布的 GA 版本加入了哪些新特性?对开发者而言意味着什么?

龙井 8.0.0-GA 的新变化

8.0.0-GA 的工作目的是为了让 Dragonwell 尽快能够在产品环境里使用。在这个版本里我们同步了 OpenJDK 上游社区 jdk8u212-b04 的最新更新,这也意味着我们同步了上游最新的安全更新和补丁。

除了同步上游,Dragonwell8 还修复了一些在阿里巴巴的 Java 场景下发现的一些非常重要的 Bug,并且经受了阿里巴巴内部场景的检验。同时我们也提供了一个默认的安全证书,这个证书我们会随时更新和维护。

熟悉 Dragonwell 的小伙伴可能都知道,Dragonwell 和 OpenJDK 上游相比提供了一些专有的特性比如:JFR,JWarmUp 等。这些特性在阿里巴巴内部得到了广泛应用,为阿里巴巴的 Java 业务的稳定运行立下了汗马功劳,也可以说是 Dragonwell 的独门武器。在 8.0.0-GA,我们也针对 JFR 特性做了一些修复和兼容性上的改进。所以喜欢 Dragonwell 新特性的的社区小伙伴们可以放心大胆的使用它们了。我们坚信,这些新特性不仅能够阿里巴巴带来价值,同时也能给社区的Java生态带来价值。

8.0.0-GA 的发布具体的内容大家可以参考 github 的 release notes, 戳这里

龙井的新征程

介绍完龙井 8.0.0-GA 的新变化,很多小伙伴已经跃跃欲试了。别忙,在使用之前我们再多唠两句,作为龙井的家人,宝宝该如何成长,我们有着许多的想法,但龙井是社区的孩子,但我们也非常希望社区的小伙伴们能够帮助它们变化成长。所以我们就一起谈谈龙井未来可能发生那些变化。

龙井的自从诞生开始,就吸引了社区的目光,尤其是 Dragonwell JDK 的一些新特性,帮助用户在面临业务挑战时有了更多选择。在今年 ISCA2019 Runtimes in the Cloud Tutorial 中,我们向社区和学术界汇报了 Dragonwell 在新特性上的工作进展,也得到了大家的积极响应。社区的反馈也是我们下一步工作的动力,希望小伙伴多给意见。这个 talk 的介绍在这里 http://www.cs.utah.edu/cloudruntimes/schedule.html#xiaoming ppt 从这里下载 http://www.cs.utah.edu/cloudruntimes/slides/xiaoming.pdf
有兴趣的小伙伴可以看下。

Dragonwell 目前存在的几个特性都是经过阿里巴巴庞大 Java 场景的检验,在稳定性上是非常可靠的。下面我们就来具体谈谈这几个特性。

JWarmUp

JWarmUp 这个特性是为了解决阿里巴巴的双 11 场景中抢购场景 Java 系统 Warmup 的痛点。以普通的 Java 应用举例,JVM 需要经过解释执行 (interpreter) 找到热点,然后通过 JIT 编译器来加速热点方法的运行。对于高并发的场景,应用启动之后会有很长的时间处于寻找热点,编译热点的状态,这时很多性能指标 (CPU 使用率, TPS 吞吐量, RT 响应时间)是不理想的。换句话,当 Java 应用启动并提供服务之后,在相当长的时间内,处于一种 Warmup 的状态,这时候虽然 Java 能够对外提供服务,但服务的质量是比较差的,如果在这个阶段用户的并发比较高,那么就往往会造成服务质量的降级乃至服务崩溃。

为了优化这个过程,通常的工业实践会在 Java 启动后引入"预热" (Warmup) 这个步骤,通过一些人为导入的数据来让应用提前加热,在预热完成之前,用户的请求通过网络控制不让它发送到 Java 进程,在预热完成之后才打开流量限制让 Java 真正提供服务。这个做法可以部分缓解上述问题,但是这个方案在很多场景下会有一些局限性,这是因为很多情况下,获取一份高质量的预热数据是很困难的。而预热数据的正确性直接影响到预热的效果,与实际情况相符的数据可以提高编译的质量,如果不一致,有时反而会造成反面效果,比如一种常见的情况是预热时会漏掉一些重要方法没有被调用。更糟糕的情况是由于和实际情况不一致,导致 JVM “退优化”已编译的方法,重新开始编译,反而恶化了状况。由此可见,如何准备预热数据其实是一个挺复杂的问题,在实际运维中还没有很好的解决方法。

Dragonwell 提出的 JWarmup 技术从 JVM 层面来解决这个痛点,基本原理是利用之前运行的情况找到热点方法和 java class 信息,之后的 JVM 运行实例可以利用上次的信息来预热,不需要通过人为数据来预热。收集热点的实例可以有多种选择,例如在应用集群中选择一个节点,也可以在发布过程中选择一个 beta 发布的阶段来收集。相比之前“人为数据”的方式,主要有这几个优势:

  1. 收集热点的时候可以利用真实数据,达到更好的编译效果。
  2. 加速预热的过程。由于热点方法可以在加载后直接编译,节省了解释执行,profiling 等过程。

这个功能在 specjvm2008 的基准测试中,对于某些测试用例,跑分会有明显提高:

# 标准OpenJDK在specjvm2008的xml.validation测试用例上的跑分
Score on xml.validation: 268.07 ops/m
# Dragonwell在specjvm2008的xml.validation测试用例上的跑分
Score on xml.validation: 294.95 ops/m

可以看出 Dragonwell 将 xml.validation 的跑分从 268.07 ops/m 提高到 294.95 ops/m,大概有10%的提高。

这个特性在阿里巴巴的双 11 抢购场景中得到了大量的验证,可以说是 Dragonwell 的秘密武器。目前我们也正在社区努力推进,希望通过 JEP 的方式,把这个功能推进到上游 OpenJDK 社区。毕竟好用的东西,不能只有我们自己有,大家要共同富裕才是王道。目前这个 JEP Draft 正在社区 review 的阶段,小伙伴如果觉得这个特性好用的话,也可以 OpenJDK 社区的邮件列表里代表中国开发者为 Dragonwell 发声。

JFR

JFR 全名是 Java Flight Recorder(Java 飞行记录仪), 是 Dragonwell 的一个功能特性,当该功能被打开后,JVM 能够以非常小的性能开销记录 Java 运行过程中产生的各种运行时数据。产生的 JFR 数据包含 JVM 运行时的各种微观细节,可以被 JMC(Java Mission Control) 进行分析。JMC 是一个桌面应用程序,通过解析 JFR 数据,JMC 能够高效快速的定位线上产品环境的各种故障。它能够分析内存分配热点,方法调用热点,方法调用超时分析,内存泄漏,IO 活动,线程活动等各个方面,帮助 Java 用户保证服务的稳定。

阿里巴巴日常开发过程中遇到的很多问题都是通过 JFR 得到解决的,可以说是 Java 故障诊断的一个利器。JFR 这个功能在 OpenJDK 11 以及以上的版本才有。在阿里巴巴的推动努力下,JFR 功能已经开始被 OpenJDK 社区接受,计划进 OpenJDK 8u 主线,目前社区的移植工作正在 incubator 分支紧张得进行当中,在不远的将来,整个 OpenJDK 8 的下游生态都可以享受这个工作成果。

Dragonwell 作为 JFR 在 OpenJDK 8u 社区工作的参与方,会源源不断的把 JFR 的最新工作成果及时引入 Dragonwell,Dragonwell 的用户可以说有福了。另外,除了 JFR 社区现有的功能,Dragonwell 在 JFR 上也做了很多增强和创新,一方面我们会积极把这些 JFR 的新特性反馈给上游 OpenJDK 社区,另外,在推动上游的同时,Dragonwell 的用户会天然的享有一些特别的福利:在上游社区接受这些特性之前,Dragonwell 会最先开源这些新功能。

神秘嘉宾: ElasticHeap

最后就要介绍下我们的神秘嘉宾 ElasticHeap 了。Dragonwell 会源源不断地把阿里巴巴内部的一些创新特性反馈到社区,ElasticHeap 就是继 JFR,JWarmUp 之后,Dragonwell 带着满满的诚意计划开放的第三个新特性(进入下一个版本发布),OpenJDK 社区也是没有的哦。

大家知道,Java 作为高级语言会带有垃圾回收器,随着程序的运行,Java 会把用户配置的内存逐渐全部使用掉。即使这些 Java 进程后来变得比较空闲,不需要这么多资源了,那这些被占用掉的内存也不会归还给操作系统,从资源利用的角度,这会带来某种意义上的浪费。而 Dragonwell 的 ElasticHeap 就改变了这种情况,这是一个基于 G1 GC 的动态堆弹性伸缩的功能,可以有效节约 java 进程实际物理内存占用。Openjdk8 仅支持在 Full GC 时按照一定规则归还物理内存。而 Dragonwell 的 ElasticHeap 提供了更敏捷有效的归还内存的方式,有如下几个特点:

  1. 不依赖 Full GC 和其他 STW 暂停处理弹性堆伸缩,不增加额外 STW 开销,不影响 Java 线程服务。
    2. 支持多种模式。
    a. 根据内存分配速度和 GC 压力自适应调整堆大小(自动归还内存)
    b. 根据 jcmd/MXBean 命令主动式限制堆的大小(可整堆限制或分代限制)

下图是阿里巴巴电商应用在双 11 时使用 ElasticHeap GC 压力自适应堆调整的应用的监控图

  1. 图中上半部分为 CPU 使用率,下半部分为物理内存使用率
  2. 双 11 整点当服务流量进来时 (traffic peak starts),CPU 使用率大幅提升
  3. 同时开启 ElasticHeap 堆内存自适应调整时,会配合 GC 压力增大快速回涨堆内存;流量退去 CPU 利用率变小后,GC 压力变小后,迅速的归还物理内存
  4. 本例中,低流量时归还物理内存约 20-30%

各位小伙伴们请期待吧,ElasticHeap 将在下个版本的发布中揭开神秘面纱。

安装使用

目前 Alibaba Dragonwell 只支持 Linux x86-64 平台,开发者可通过如下步骤使用 Alibaba Dragonwell。

安装 Alibaba Dragonwell

  1. 选项一:下载预编译 Dragonwell 二进制包
  1. 选项二:使用 YUM 工具安装

Alibaba Cloud Linux 2 YUM 仓库已经正式支持阿里巴巴 Dragonwell JDK,该 YUM 仓库与 Aliyun Linux 17.1, Red Hat Enterprise Linux 7 以及 Centos 7 完全兼容。


对于使用 Alibaba Cloud Linux 2 操作系统的用户,只需要执行 sudo yum install -y java-1.8.0-alibaba-dragonwell 就可以顺利安装。


如果用户没有使用 Alibaba Cloud Linux 2,但使用的 Linux 发行版和 Alibaba Cloud Linux 2 YUM 仓库兼容,那么在 yum install 安装前需要手动将 Alibaba Cloud Linux 2 YUM 仓库添加到操作系统的 YUM 源里去。添加的方法很简单,只需要在 /etc/yum.repos.d/ 里添加一个包含如下内容的 alilinux-plus.repo 文件即可。

# plus packages provided by Aliyun Linux dev team
[plus]
name=AliYun-2.1903 - Plus - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/alinux/2.1903/plus/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/alinux/RPM-GPG-KEY-ALIYUN

为 Java 应用启用 Alibaba Dragonwell

对于使用预编译 Dragonwell 二进制包的 JDK 用户,只需将应用脚本或者环境变量中的 JDK 目录变量(一般是 JAVA_HOME) 指向上一步中安装的 Alibaba Dragonwell 目录。然后,重启应用以使用 Alibaba Dragonwell JDK 配置。


如果用户是通过 YUM 工具安装的 Dragonwell JDK,YUM 会在安装过程提示 JDK 的使用方法,提示的内容如下

=======================================================================
Alibaba Dragonwell is installed to:
    /opt/alibaba/java-1.8.0-alibaba-dragonwell-8.0.0.212.b04-1.al7
You can set Alibaba Dragonwell as default JDK by exporting the
following ENV VARs:
$ export JAVA_HOME=/opt/alibaba/java-1.8.0-alibaba-dragonwell-8.0.0.212.b04-1.al7
$ export PATH=${JAVA_HOME}/bin:$PATH
=======================================================================

总结

龙井 8.0.0-GA 的发布宣告着 Dragonwell 进入一个新征程,越来越多的新特性将会被开源。也希望社区小伙伴们多多支持,龙井 JDK 将和整个中国的 Java 开发者一起,为增强国内 Java 生态力量而努力,让中国开发者的声音被全世界所倾听。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

阿里开源 Dragonwell JDK 重磅发布 GA 版本:生产环境可用 的相关文章

  • sql:无法解决 equal to 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_Taiwan_Stroke_CI_AS" 之间的排序规则冲突。

    无法解决 equal to 操作中 Chinese PRC CI AS 和 Chinese Taiwan Stroke CI AS 之间的排序规则冲突 CREATE VIEW View VipBranchStaffBranchList AS
  • VMware虚拟机安装Windows 7

    昨天我总结了win10和win11的教程 今天也把win7总结下 一来方便各位探索Windows7 二来也可以给自己备份 1 准备工作 首先我们在VMware里面安装Windows7需要做的准备工作 VMware Workstation软件
  • 国际版阿里云/腾讯云:阿里弹性云手机正式公测

    阿里弹性云手机正式公测 什么是 云手机 与我们传统的手机有何区别 它又有什么用处呢 当你接触到云手机概念的时候 是不是也会有这一连串的疑问 本文将为你揭开云手机的奥秘面纱 2021年12月1日 阿里弹性云手机正式公测 移动运用新载体 赋予手
  • Linux系统跳过密码登录

    一 引导系统 RHEL7的标准引导系统是GRUB2 RHEL6默认使用GRUB1 这里主要讲GRUB2 在Linux系统开机选择内核时 按下e进入内核引导参数的编辑菜单 找到以linux16开头的一行 在行末添加更多的命令 例如 在行末尾添
  • 下载文件的响应头设置

    headers add Content Disposition attachment filename 1 jpg
  • 解决【C++】vector subscript out of range下标越界

    1 检查遍历语句是否正确 vector
  • 微信小程序按钮控件设置呈现效果

    1 效果图 在小程序中完成上述布局 需要设置四个按钮位置 控制每个按钮大小 设置按钮背景颜色 设置标题和图标的位置 2 代码说明 2 1 index wxml
  • 人工智能数学基础--概率与统计11:离散随机变量的超几何分布和负二项分布

    一 超几何分布 1 1 定义 假设N个产品中M个废品 以X记为从N个产品中随机抽出n个里面所包含的废品数m 则 P X m
  • 从0到1搭建个人博客-Django(九)

    你好 我是goldsunC 让我们一起进步吧 从0到1搭建个人博客 Django 九 回顾系列博客请到专栏哦 增加修改文章功能 修改文章功能和新建文章功能类似 只不过修改文章的模板里面已经有了相应文章的内容 先来增加个视图函数来实现修改文章
  • 看完这篇 教你玩转渗透测试靶机vulnhub——DC3

    Vulnhub靶机DC3渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 漏洞发现 SQL注入 文件上传 提权 Vulnhub靶机渗透总结 Vulnhub靶机介绍 v
  • 邮件被拒错误代码大全

    http bbs chinaunix net thread 962544 1 1 html 1 邮件地址错误 如果退信原因中有如下信息之一 请检查收信人的邮件地址是否有误 550
  • 【HTTP/1.1、HTTP/2、HTTP/3】

    文章目录 HTTP 1 1 如何优化 避免发送HTTP请求 减少HTTP次数 减少 HTTP 响应的数据大小 HTTP 2 HTTP 1 1性能问题 HTTP 2的性能优化 头部压缩 二进制帧 重点 并发传输 服务器主动推送资源 HTTP
  • 如何在IDEA中显示时序图

    如何在IDEA中显示时序图 有时候 我们想要了解代码的运行过程的时候 想要看到方法的调用流程 这个时候就希望有一个时序图可以看 但是人工来画时序图太麻烦了 有没有办法在IDEA中直接生成呢 当然是可以的 这里我们需要使用到Sequence
  • Python实现单例模式8种方法的优缺点比较

    Python实现单例 结论先行 为什么要使用单例模式 实例化过程原理 评价标准 一 使用类方法 getInstance 作为获取实例的接口 二 使用模块 同名实例替换类变量 三 使用函数装饰器 四 使用类装饰器 五 使用装饰器返回类 六 使
  • 微信小程序客服

    1 微信公众平台 功能 客服 微信客服 处 填写对应的企业ID 完成绑定 2 wx openCustomerServiceChat wx openCustomerServiceChat Object object 微信开放文档 qq com
  • 外观模式(Facade)

    摘录自 大话设计模式 外观模式 外观模式 Facade 为子系统中的一组接口提供一个一致的界面 此模式定义了一个高层接口 这个接口使得这一子系统更加容易使用 四个子系统的类 public class SubSystemOne public
  • Spring boot_公众号模板消息

    1 pom引入
  • 算法笔试题_2

    给定一个 N 进制正整数 把它的各位数字上数字倒过来排列组成一个新数 然后与原数相加 如果是回文数则停止 如果不是 则重复这个操作 直到和为回文数为止 如果 N 超过 10 使用英文字母来表示那些大于 9 的数码 例如对 16 进制数来说

随机推荐

  • 大数据技术与人工智能的关系

    结合了学习的知识和网上的相关资料 我个人觉得大数据与人工智能的关系如下 人工智能需要数据来建立其智能 特别是机器学习 大数据技术为人工智能提供了强大的存储能力和计算能力 如果说大数据相当于人的大脑存储了海量知识 而人工智能则是吸收了大量的数
  • the sip module implements API v12.0 to v12.8 but the PyQt5.QtGui module requires API v12.9

    问题描述 RuntimeError the sip module implements API v12 0 to v12 8 but the PyQt5 QtGui module requires API v12 9 分析原因 pyqt更新
  • Git Extension工具安装及使用

    以下界面所示的三个工具 如果没安装过 则勾上让其安装 MsysGit为Git的Windows版本 必须要安装 Kdiff为对比 合并工具 可选安装 可以换为使用其它的相关工具 最后一个Windows Credential Store for
  • java判断char是否相等

    在 Java 中可以使用 运算符来判断两个 char 类型的变量是否相等 例如 char c1 a char c2 b if c1 c2 System out println c1 is equal to c2 else System ou
  • 转:Python数据分箱,计算woe,iv

    转自 https zhuanlan zhihu com p 38440477 https www cnblogs com wzdLY p 9853209 html https github com Lucky Bone Discretiza
  • SQL语句的基本常用的一些语法

    1 ORDER BY 字段名 以 排序 如 select from A order by id desc 从大 gt 小 asc 从 小 gt 大 2 Group By 字段名 以 分组 select from A group by id
  • IOTDB-源码解析-查询

    单机查询流程 QueryPlan类 QueryPlan是有关查询相关的类 所有的plan都继承了PhysicalPlan这个虚类 QueryPlan也是一个虚类 其UML类图如下所示 IotDB中的各种reader 此章节请酌情参考查询基础
  • 白盒测试(基本路径法)代码

    白盒测试的一种常用方法是基本路径法 根据源代码构造程序流程图 转换为控制流图 得到基本路径 进而为每条基本路径设计测试用例 基本路径法的一个关键步骤是识别出所有的基本路径 本次作业要求你写一个C 程序 输入 待测程序的控制流图 输出 圈复杂
  • chisel环境安装

    step 0 把java装好 chisel依赖于java的 所以第一步你要装个java 去oracle官网去下载 下面网站 Java SE Development Kit 8 下载 www oracle com 如果你恰好家境贫寒 就下上面
  • 关于多项目使用Maven子工程无法使用

    前几天在网上找了一个商城的项目实战遇到一个问题 导入各种包但是Spring的核心配置文件还是全篇爆红 我自己记录一下我的解决方案 因为是多项目的问题 我当时创建文件的时候都把文件建在了Maven的parent目录下 所以无法导包进入 将每个
  • 【Unity基础】day1整理 -----小球吃金币

    小球 先搭一个场地Plane 命名Map 通过将四个墙的立方体归入Map 可以同时控制大小 分别赋予场地和墙的材质 创造一个小球Player 赋予材质和刚体 因为要实现键盘操作控制小球 因此需要写脚本挂载到Player上 using Sys
  • 基于粒子群算法的PID控制器优化设计(matlab实现)

    1 理论基础 PID控制器应用广泛 其一般形式为 可见 PID控制器的性能取决于Kp Ki Kd这3个参数是否合理 因此 优化PID控制器参数具有重要意义 目前 PID控制器参数主要是人工调整 这种方法不仅费时 而且不能保证获得最佳的性能
  • MySQL的C++封装

    最近的项目数据库管理系统从SQL SERVER2000迁移到了MySQL上来 之前基于ADO的连接方式连接上SQL SERVER 使用MySQL数据库管理系统之后 直接在MySQL的C语言的API上以面向对象的方式封装实现了数据库的创建 表
  • C语言操作EXCEL文件(读写)

    C语言操作EXCEL文件 读写 本文主要介绍通过纯C语言进行EXCEL的读写操作 修改时间2018 08 28 如果运行结果均是0 请看文章最后一节 C语言读操作 C语言写操作 在之前需要使用C语言读取Excel文件内容的功能 查阅了很多资
  • markdown 之项目目录文件结构展示

    一般来说 我们为项目写readme文档时 都会对整个目录的项目结构做个说明 例如这样的 我们可以用mddir来生成项目目录结构 mddir 使用命令 node mddir relative path 例子 打开终端或命令提示符 并cd进入m
  • ubuntu系统离线安装docker20.10.7版本及nvidia-container-runtime3.11.0-1版本(离线安装nvidia-docker)

    1 下载3个docker相关安装包 containerd io 1 4 6 1 amd64 deb docker ce cli 20 10 7 3 0 ubuntu xenial amd64 deb docker ce 20 10 7 3
  • HTTPS

    本文首发于我的个人技术博客 看完还不懂HTTPS我直播吃翔 存在即合理 http是非常常见的应用层协议 是超文本传输协议的简称 其传输的内容都是明文的 在这个混乱的世界 明文传输信息想想就可怕 网络 小混混 的手段远比我们这些凡人高明得多
  • SpringBoot2-5

    先解决一个问题 报错1 java 无效的目标发行版 17 修改位置 maven的配置需要改为选取本地maven所在目录 这些都是java指定了1 8比较低但是又都用的版本导致 再解决一个问题 报错2 java 无法访问org springf
  • 《小家:越住越大》

    第一章 二八定律 房子单价很贵 但却像人一样 慢慢被不必要的杂物堆积 变得杂乱 空间不足 人需要减肥 房子也需要减负 常用的东西 20 放在随手可及的地方 不常用的东西 80 合理收纳 这就是隐藏与显示的二八定律 收纳百分之八十的生活杂物
  • 阿里开源 Dragonwell JDK 重磅发布 GA 版本:生产环境可用

    今年 3 月份 阿里巴巴重磅开源 OpenJDK 长期支持版本 Alibaba Dragonwell 的消息 在很长一段时间内都是开发者的讨论焦点 该项目在 Github 上的 Star 数迅速突破 1400 近日 Dragonwell J