今年 3 月份,阿里巴巴重磅开源 OpenJDK 长期支持版本 Alibaba Dragonwell 的消息,在很长一段时间内都是开发者的讨论焦点,该项目在 Github 上的 Star 数迅速突破 1400。近日,Dragonwell JDK 8.0.0 正式发布 GA 版本,这意味着其已经具有在生产环境正式运行的能力。html
2019 年 3 月,Dragonwell JDK正式开源,发布预览 (Preview) 版本。近日,阿里巴巴重磅宣布 Dragonwell JDK 8.0.0-GA 正式发布,这意味着 Dragonwell JDK 已经彻底具有在生产环境运行的能力。在过去三个月时间内,Dragonwell 收到了不少来自社区成员的反馈。那么,本次正式发布的 GA 版本加入了哪些新特性?对开发者而言意味着什么?java
龙井 8.0.0-GA 的新变化linux
8.0.0-GA 的工做目的是为了让 Dragonwell 尽快可以在产品环境里使用。在这个版本里咱们同步了 OpenJDK 上游社区 jdk8u212-b04 的最新更新,这也意味着咱们同步了上游最新的安全更新和补丁。git
除了同步上游,Dragonwell8 还修复了一些在阿里巴巴的 Java 场景下发现的一些很是重要的 Bug,而且经受了阿里巴巴内部场景的检验。同时咱们也提供了一个默认的安全证书,这个证书咱们会随时更新和维护。github
熟悉 Dragonwell 的小伙伴可能都知道,Dragonwell 和 OpenJDK 上游相比提供了一些专有的特性好比:JFR,JWarmUp 等。这些特性在阿里巴巴内部获得了普遍应用,为阿里巴巴的 Java 业务的稳定运行立下了汗马功劳,也能够说是 Dragonwell 的独门武器。在 8.0.0-GA,咱们也针对 JFR 特性作了一些修复和兼容性上的改进。因此喜欢 Dragonwell 新特性的的社区小伙伴们能够放心大胆的使用它们了。咱们坚信,这些新特性不只可以阿里巴巴带来价值,同时也能给社区的Java生态带来价值。安全
龙井的新征程网络
介绍完龙井 8.0.0-GA 的新变化,不少小伙伴已经跃跃欲试了。别忙,在使用以前咱们再多唠两句,做为龙井的家人,宝宝该如何成长,咱们有着许多的想法,但龙井是社区的孩子,但咱们也很是但愿社区的小伙伴们可以帮助它们变化成长。因此咱们就一块儿谈谈龙井将来可能发生那些变化。并发
龙井的自从诞生开始,就吸引了社区的目光,尤为是 Dragonwell JDK 的一些新特性,帮助用户在面临业务挑战时有了更多选择。在今年 ISCA2019 Runtimes in the Cloud Tutorial 中,咱们向社区和学术界汇报了 Dragonwell 在新特性上的工做进展,也获得了你们的积极响应。社区的反馈也是咱们下一步工做的动力,但愿小伙伴多给意见。这个 talk 的介绍在这里 http://www.cs.utah.edu/cloudr... ppt 从这里下载 http://www.cs.utah.edu/cloudr...
有兴趣的小伙伴能够看下。运维
Dragonwell 目前存在的几个特性都是通过阿里巴巴庞大 Java 场景的检验,在稳定性上是很是可靠的。下面咱们就来具体谈谈这几个特性。jvm
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 发布的阶段来收集。相比以前“人为数据”的方式,主要有这几个优点:
收集热点的时候能够利用真实数据,达到更好的编译效果。
加速预热的过程。因为热点方法能够在加载后直接编译,节省了解释执行,profiling 等过程。
这个功能在 specjvm2008 的基准测试中,对于某些测试用例,跑分会有明显提升:
Score on xml.validation: 268.07 ops/m
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 提供了更敏捷有效的归还内存的方式,有以下几个特色:
不依赖 Full GC 和其余 STW 暂停处理弹性堆伸缩,不增长额外 STW 开销,不影响 Java 线程服务。
下图是阿里巴巴电商应用在双 11 时使用 ElasticHeap GC 压力自适应堆调整的应用的监控图
图中上半部分为 CPU 使用率,下半部分为物理内存使用率
双 11 整点当服务流量进来时 (traffic peak starts),CPU 使用率大幅提高
同时开启 ElasticHeap 堆内存自适应调整时,会配合 GC 压力增大快速回涨堆内存;流量退去 CPU 利用率变小后,GC 压力变小后,迅速的归还物理内存
本例中,低流量时归还物理内存约 20-30%
各位小伙伴们请期待吧,ElasticHeap 将在下个版本的发布中揭开神秘面纱。
安装使用
目前 Alibaba Dragonwell 只支持 Linux x86-64 平台,开发者可经过以下步骤使用 Alibaba Dragonwell。
安装 Alibaba Dragonwell
选项一:下载预编译 Dragonwell 二进制包
从 Alibaba Dragonwell 的 Github 页面下载二进制 tar 包,连接 https://github.com/alibaba/dr...
将下载下来的 tar 包解压到目标安装目录便可
选项二:使用 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]
name=AliYun-2.1903 - Plus - mirrors.aliyun.com
baseurl=http://mirrors.aliyun.com/ali...$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/ali...
为 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
总结
龙井 8.0.0-GA 的发布宣告着 Dragonwell 进入一个新征程,愈来愈多的新特性将会被开源。也但愿社区小伙伴们多多支持,龙井 JDK 将和整个中国的 Java 开发者一块儿,为加强国内 Java 生态力量而努力,让中国开发者的声音被全世界所倾听。