当前位置: 首页 > Linux

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

时间:2023-04-07 00:26:11 Linux

阿里巴巴开源DragonwellJDK发布GA版:生产环境可用Github上Star数迅速突破1400,近日,DragonwellJDK8.0.0正式发布GA版,意味着具备正式运行生产环境的能力.2019年3月,DragonwellJDK正式开源并发布预览版。近日,阿里巴巴宣布正式发布DragonwellJDK8.0.0-GA,这意味着DragonwellJDK完全具备了在生产环境中运行的能力。在过去的三个月里,Dragonwell收到了来自社区成员的大量反馈。那么,本次正式发布的GA版本新增了哪些功能呢?对开发者意味着什么?龙井8.0.0-GA新变化8.0.0-GA的目的是让Dragonwell尽快上线生产环境。在这个版本中,我们同步了OpenJDK上游社区jdk8u212-b04的最新更新,也意味着我们同步了最新的上游安全更新和补丁。除了与上游同步,Dragonwell8还修复了阿里巴巴Java场景中发现的一些非常重要的bug,经受住了阿里巴巴内部场景的考验。同时,我们也提供了默认的安全证书,我们会随时更新和维护。熟悉Dragonwell的朋友可能知道,Dragonwell相对于OpenJDK上游提供了一些专有的特性,比如:JFR、JWarmUp等,这些特性在阿里巴巴内部得到了广泛的应用,为阿里巴巴Java业务的稳定运行做出了很大的贡献.也可以说是龙之井的独门兵器。在8.0.0-GA中,我们还对JFR功能进行了一些修复和兼容性改进。所以喜欢Dragonwell新特性的社区朋友可以放心使用。我们坚信,这些新特性不仅能为阿里巴巴带来价值,也能为社区的Java生态带来价值。8.0.0-GA的发布详情可以参考github上的releasenotes。点此开启龙井新征程。在介绍了龙井8.0.0-GA的新变化之后,已经有不少小伙伴跃跃欲试了。不用忙,先聊几句再用。作为龙井的家人,对于宝宝应该如何成长,我们有很多想法,但龙井是社区的孩子,但我们也非常希望社区的朋友们能够帮助他们改变成长。那么我们就来说说龙井未来可能发生的变化。龙井自诞生以来就受到了社区的关注,尤其是DragonwellJDK的一些新特性,帮助用户在面对业务挑战时有更多的选择。在今年的ISCA2019RuntimesintheCloudTutorial中,我们向社区和学术界汇报了Dragonwell在新特性方面的工作进展,得到了大家的积极响应。社区的反馈也是我们下一步工作的动力,希望大家多提意见。这个演讲的介绍在这里http://www.cs.utah.edu/cloudruntimes/schedule.html#xiaomingppt从这里下载http://www.cs.utah.edu/cloudruntimes/slides/xiaoming.pdf有兴趣的朋友们可以看看。Dragonwell目前的特性已经过阿里巴巴庞大的Java场景测试,在稳定性方面非常可靠。让我们详细谈谈这些功能。JWarmUpJWarmUp这个特性是为了解决阿里巴巴双11场景抢购场景下Java系统Warmup的痛点。以普通的Java应用为例,JVM需要通过解释器发现热点,然后使用JIT编译器来加速热点方法的运行。对于高并发场景,应用启动后,会长时间处于搜索热点、编译热点的状态。这个时候很多性能指标(CPU使用率、TPS吞吐量、RT响应时间)都不理想。也就是说,Java应用启动并提供服务后,会长期处于Warmup状态。此时Java虽然可以对外提供服务,但是服务质量比较差。如果用户的并发量比较高,往往会造成服务质量下降甚至服务崩溃。为了优化这个过程,通常的工业实践在Java启动后引入了一个“预热”步骤。一些人为导入的数据用于提前预热应用程序。让它发送给Java进程,只有预热完成后才会开启流量限制,Java才能真正提供服务。这种做法可以部分缓解上述问题,但是这种方案在很多场景下都有一定的局限性,因为在很多情况下,很难获得高质量的预热数据。预热数据的正确与否直接影响到预热的效果。符合实际情况的数据可以提高编制质量。如果不一致,有时会造成适得其反的效果。比如常见的情况是预热的时候会漏掉。一些重要的方法没有被调用。更糟糕的是,JVM因与实际情况不一致而对编译后的方法进行“去优化”,并重新开始编译,使情况变得更糟。可见,如何准备预热数据其实是一个非常复杂的问题,在实际运维中也没有很好的解决方案。Dragonwell提出的JWarmup技术从JVM层面解决了这个痛点。基本原理是利用之前的运行情况寻找热点方法和java类信息,后续的JVM运行实例可以利用上次的信息进行预热,不需要人工数据。暖身。收集热点实例的方式有很多,比如在应用集群中选择一个节点,或者在发布过程中选择一个beta发布阶段进行收集。与以往的“人工数据”方式相比,有几个优点:在收集热点时,可以使用真实数据,获得更好的编译效果。加速预热过程。由于hotspot方法加载后可以直接编译,省去了解释执行、profiling等过程。在specjvm2008的benchmark测试中,部分测试用例的跑分会有明显提升:#StandardOpenJDKrunningscoreonxml.validationtestcasesofspecjvm2008Scoreonxml.validation:268.07ops/m#Dragonwellinspecjvm2008Scoreonxml.validation:294.95ops/monthexml.validation测试用例表明Dragonwell提高了xml.validation的运行分数从268.07ops/m到294.95ops/m,提高了大约10%。这个特性在阿里巴巴的双11抢购场景中得到了很多验证,可以说是Dragonwell的秘密武器。目前我们也在社区努力通过JEP将这个功能推广到上游的OpenJDK社区。毕竟,有用的东西不能只属于我们自己。是大家一起致富的王道。目前,这个JEPDraft正处于社区审核阶段。如果觉得这个功能有用,也可以在OpenJDK社区的邮件列表中代表中国开发者为Dragonwell发声。JFRJFR的全称是JavaFlightRecorder(Java飞行记录器),是Dragonwell的一个特性。开启此功能后,JVM可以记录Java运行过程中产生的各种运行时数据,而性能开销很小。生成的JFR数据包含JVM运行时的各种微观细节,可以通过JMC(JavaMissionControl)进行分析。JMC是一个桌面应用程序。通过分析JFR数据,JMC可以高效、快速地定位在线产品环境中的各种故障。可以从内存分配热点、方法调用热点、方法调用超时分析、内存泄漏、IO活动、线程活动等多方面进行分析,帮助Java用户保障服务稳定性。阿里巴巴日常开发过程中遇到的很多问题都是通过JFR来解决的,可以说是Java故障诊断的利器。JFR功能仅在OpenJDK11及更高版本中可用。在阿里巴巴的努力下,JFR功能已经开始被OpenJDK社区接受,并计划进入OpenJDK8u主线。目前,社区的移植工作正在孵化器分支进行。在不久的将来,OpenJDK8的整个下游生态将会面世。享受这项工作的成果。作为JFR在OpenJDK8u社区工作的参与者,Dragonwell会不断将JFR的最新工作成果及时引入Dragonwell。龙井用户可以说是有福了。此外,除了JFR社区已有的功能外,Dragonwell还在JFR上做了很多增强和创新。一方面,我们会将JFR的这些新特性积极反馈给上游的OpenJDK社区。另外,在向上游推广的同时,Dragonwell用户自然会享受到一些特殊的好处:在上游社区接受这些特性之前,Dragonwell会率先开源这些新特性。神秘嘉宾:ElasticHeap最后要介绍我们的神秘嘉宾ElasticHeap。Dragonwell会不断将阿里巴巴内部的一些创新功能反馈给社区。ElasticHeap是Dragonwell继JFR、JWarmUp(进入下一版本发布)之后,计划诚意开放的第三个新特性。OpenJDK社区哦,不。众所周知,Java作为一门高级语言,都会有垃圾收集器。随着程序的运行,Java会逐渐用完用户配置的所有内存。即使这些Java进程后来变得比较空闲,不需要那么多资源,占用的内存也不会归还给操作系统。从资源利用的角度来看,这会带来一些浪费的感觉。Dragonwell的ElasticHeap改变了这种情况。这是一个基于G1GC的动态堆弹性伸缩功能,可以有效节省java进程的实际物理内存使用量。Openjdk8只支持在FullGC时按照一定的规则归还物理内存。Dragonwell的ElasticHeap提供了一种更敏捷有效的内存归还方式。它具有以下特点:不依赖FullGC和其他STW停顿来处理弹性堆伸缩,不增加额外的STW开销,不影响Java线程服务。2.支持多种模式。A。根据内存分配速度和GC压力自适应调整堆大小(自动归还内存)b.根据jcmd/MXBean命令主动限制堆大小(可以按整个堆限制,也可以按代限制)。下图是阿里巴巴电商应用在双11使用ElasticHeapGC压力自适应堆调整的应用的监控图,图中上半部分是CPU占用率,下半部分是物理内存使用率.当双11(流量高峰开始)业务流量进来,CPU使用率明显上升,开启ElasticHeap堆内存自适应调整时,堆内存会随着GC压力的增加而快速再膨胀;流量退去后,CPU使用率降低,GC压力降低,物理内存快速回归。在此示例中,当流量较低时,返回大约20-30%的物理内存。小伙伴们敬请期待。ElasticHeap将在下一个版本发布中揭开神秘面纱。目前,AlibabaDragonwell仅支持Linuxx86-64平台。开发者可以通过以下步骤使用AlibabaDragonwell。安装AlibabaDragonwell选项一:下载预编译好的Dragonwell二进制包从AlibabaDragonwell的Github页面下载二进制tar包,链接https://github.com/alibaba/dragonwell8/releases将下载的tar包解压到目标安装目录方案二:使用YUM工具安装AlibabaCloudLinux2YUM仓库已经正式支持AlibabaDragonwellJDK,YUM仓库完全兼容AliyunLinux17.1、RedHatEnterpriseLinux7和Centos7。对于使用AlibabaCloudLinux的用户2操作系统,只需要执行sudoyuminstall-yjava-1.8.0-alibaba-dragonwell即可顺利安装。如果用户不使用AlibabaCloudLinux2,但使用的Linux发行版兼容AlibabaCloudLinux2YUM仓库,则需要在操作系统的YUM源中手动添加AlibabaCloudLinux2YUM仓库,然后再使用yuminstall安装。添加方法很简单,在/etc/yum.repos.d/中添加一个alilinux-plus.repo文件,内容如下。#加上AliyunLinux开发团队提供的包[plus]name=AliYun-2.1903-Plus-mirrors.aliyun.combaseurl=http://mirrors.aliyun.com/alinux/2.1903/plus/$basearch/gpgcheck=1gpgkey=httphttps://mirrors.aliyun.com/alinux/RPM-GPG-KEY-ALIYUN为Java应用启用AlibabaDragonwell对于使用预编译Dragonwell二进制包的JDK用户,只需在应用脚本或环境变量中设置JDK目录变量(一般是JAVA_HOME)指向上一步安装的AlibabaDragonwell目录。然后,重启应用程序以使用AlibabaDragonwellJDK配置。如果用户通过YUM工具安装DragonwellJDK,YUM会在安装过程中提示如何使用JDK。提示内容如下===============================================================================AlibabaDragonwell安装到:/opt/alibaba/java-1.8。0-alibaba-dragonwell-8.0.0.212.b04-1.al7您可以通过导出以下ENVVAR将AlibabaDragonwell设置为默认JDK:$exportJAVA_HOME=/opt/alibaba/java-1.8.0-alibaba-dragonwell-8.0。0.212.b04-1.al7$导出PATH=${JAVA_HOME}/bin:$PATH===============================================================================总结龙井发布8.0.0-GA宣告Dragonwell进入了新的征程,越来越多的新特性将会开源。也希望社区的小伙伴多多支持。龙井JDK将与中国各地的Java开发者一起,壮大国内Java生态的实力,让中国开发者的声音被全世界听到。本文作者:一律周原创文章链接本文为云栖社区原创内容,未经允许不得转载。