
前言
目前国产化芯片无疑是中国科技圈的一大热点。得益于相对较高的自由度,以及比较完善的生态环境,ARM架构得到了众多国内芯片公司的认可。然而由于OpenJDK社区对ARM架构的支持较晚,一些国内广泛使用的JDK版本(比如JDK8)的社区代码主干上并没有对aarch64的支持;另外一些厂商虽然提供了支持aarch64的JDK,却并没有开源代码。这对尝试新架构的Java用户在选择JDK时造成了一些困扰。
为了解决这个问题,Alibaba Dragonwell近日发布了新版本(8.5.5及11.0.9.4),添加了对aarch64架构的支持,对自主芯片的规模化使用,技术架构演进给予了强力支撑。
Alibaba Dragonwell
Alibaba Dragonwell是阿里巴巴开源的JDK,它是OpenJDK的下游,提供了OpenJDK的所有能力,并且通过AdopeOpenJDK社区进行构建发布,提供高质量的经过测试验证的JDK发行版。
下图展示Alibaba Dragonwell的整体架构:
除了OpenJDK已有功能外,Alibaba Dragonwell还增加了以下独有特性
- JWarmup: 根据前一次程序运行的情况,记录下热点方法、类编译顺序等信息,在应用下一次启动的时候积极加载相关的类,并积极编译相关的方法,进而应用启动后可以直接运行编译好的Java代码。
- JFR: Java Flight Recorder (JFR) 是一款用于收集Java应用运行过程中的诊断及性能数据的工具,目前已经被集成进Alibaba Dragonwell中。在使用默认配置的情况下,JFR带来的额外开销将小于2%,因此可以用在生产环境。
- G1ElasticHeap: 支持在G1中动态归还堆物理内存并降低Java进程的内存占用。
- Wisp: Wisp在JVM上提供了一种用户态的线程实现。开启Wisp2后,Java线程不再简单地映射到内核级线程,而是对应到一个协程,JVM在少量内核线上调度大量协程执行,以减少内核的调度开销,提升web服务器的性能。
aarch64支持
在介绍Alibaba Dragonwell的aarch64支持之前,我们现在回顾下上游OpenJDK的情况。
JDK9引入了一个新JEP(Java Enhancement Proposal): JEP237 正式引入了对arm32及aarch64的支持。自此我们可以视JDK9为一个分水岭,在JDK9及之后的JDK,包括长期支持版本JDK11,在代码主干上具备对aarch64的支持,而之前的版本(例如JDK8)并不兼容aarch64。
从上游情况可知,对于Dragonwell8来说,aarch64是一个从0到1的过程,因此主要以稳定性为主,修复了JIT代码,编译线程以及锁操作中的一些bug,在阿里的多个应用中表现稳定,且通过了TCK测试。
对于Dragonwell11来说,目标是在OpenJDK11现有的基础上进行充分的优化,追求极致性能。具体的,Dragonwell11在以下方面进行了优化
- 优化了GC work stealing机制,使GC线程负载更加均衡,减少GC时间
-
使用高版本GCC编译JDK,并使用ARMv8.2的指令进行优化,hostpot JVM的性能获得了增强,特别是原子CAS(Compare and Swap)操作有明显提升。
下图是优化前后在不同核数下运行SPECjbb2015的吞吐率对比,吞吐率计算方法如下,越高越好。
吞吐率 = (运行时间 – Stop-The-World时间)/运行时间 * 100%
我们可以看到随着核数增长未优化的版本吞吐率明显下降,这是因为GC使用的CAS很多,而传统的CAS实现方式在多核情况下性能较差,导致GC暂停时间显著增加。优化后的版本随着核数增长,吞吐率始终保持在较高的水平,可拓展性很好。
小结
本文总结了Dragonwell支持aarch64架构的一些相关情况及优化措施,欢迎大家下载使用Alibaba Dragonwell。
Alibaba Dragonwell 8 Wiki
https://github.com/alibaba/dragonwell8/wikiAlibaba Dragonwell11 Wiki
https://github.com/alibaba/dragonwell11/wiki