【鲲鹏 DevKit 黑科技揭秘】┃毕昇 JDK 4大关键特性解读
发表于 2021/08/17
0
毕昇 JDK 是华为基于 OpenJDK 优化后的开源版本,是一款高性能、可用于生产环境的 OpenJDK 发行版。毕昇 JDK 稳定运行在华为内部 500 多个产品上,毕昇 JDK 团队积累了丰富的开发经验,解决了许多实际业务中由原生 OpenJDK 缺陷引起的问题。
毕昇 JDK 致力于为 Java 开发者提供一款稳定可靠、高性能、易调测的 JDK,也为用户在鲲鹏 AArch64 架构上提供一个更好的选择。本文基于毕昇 JDK8 和毕昇 JDK11 版本特性进行介绍。
了解毕昇 JDK
毕昇 JDK 是 OpenJDK 的下游,对华为内部一些应用场景上遇到的性能和稳定性问题进行了修复,并针对鲲鹏 AArch64 架构进行了稳定性增强和性能优化,尤其在大数据场景下性能更好。
(1)License:采用 GPLv2 with Classpath Exception 协议。
(2)支持 Java 版本:目前毕昇 JDK 支持 8 和 11 两个 LTS 版本。
(3)支持架构:支持鲲鹏 AArch64 架构,毕昇 JDK 开源代码支持 x86 版本自构建。
(4)支持操作系统:目前仅支持 Linux 版本,对操作系统的要求是鲲鹏 AArch64 平台上 glibc 版本不低于 2.17,基本覆盖所有主流操作系统,已验证的 OS 列表,可参考鲲鹏社区产品页的兼容性查询工具。
毕昇 JDK 新增特性
在 OpenJDK 基础上,毕昇 JDK 在鲲鹏 ARM 架构上进行了性能优化,新增了快速序列化、AppCDS、G1GC 堆内存伸缩、KAE Provider 等特性,充分提升毕昇 JDK 在鲲鹏 ARM 架构下的运行性能。下文将对这四项优势特性进行详细的介绍。
(1)快速序列化——提升原生序列化性能
1)问题背景:
在一些无法使用 Kyro(无法修改代码时),需要使用 OpenJDK 原生序列化特性的场景,OpenJDK 原生的序列化机制会耗时较长,导致性能较低。毕昇 JDK8&11 通过实行快速序列化特性提升其性能,快速序列化实现原理大致如下图:
快速序列化的实现原理:
![](https://www.hikunpeng.com/p/resource/202309/6a5f2f8789054c549065de23dba838e6.png)
通过减少序列化数据字段和提供数据缓存的方式提升 OpenJDK 原生序列化的性能,详细介绍可参考毕昇 JDK 社区快速序列化特性介绍,该特性在毕昇 JDK8&11 都支持。
2)场景建议:
业务中序列化/反序列化部分占比较高的场景可以考虑使用。比如:readObject/ writeObject 热点方法占比较高,可以尝试使能该特性。重复对象越多,场景收益越大。实测在某序列化占比较高场景,快速序列化特性较原生序列化性能收益提升15%。
3)使能方法:
-XX:+UnlockExperimentalVMOptions-XX:+UseFastSerializer -DfastSerializerEscapeMode=true
(2)AppCDS——提升 java 应用启动速度
在 Java 程序运行初始阶段,类的加载是一个比较耗时的过程,且在每次程序运行中均需要执行一遍。而 CDS(Class Data Sharing)技术,就是把类加载后的数据保存到文件中,下次运行时,直接将加载后的类数据从文件中恢复到内存中,不需要再重新执行类的加载过程,从而提高性能。AppCDS 特性在原 CDS 特性基础上增加了对应用类的支持,实现原理如下图所示:
AppCDS 的实现原理:
![](https://www.hikunpeng.com/p/resource/202309/499b3140a1fe4181a13fc5b7b2890359.png)
从实现原理图可以看到,AppCDS 特性通过从 JSA 文件读取共享数据,省略了共享类的加载过程。同时 Shared Memory 支持多进程间共享,也减少对内存的占用。具体使能方式可参考毕昇 JDK 社区关于 AppCDS 特性的使用介绍。
(3)G1GC 堆内存伸缩——及时释放空闲堆内存
在 OpenJDK 社区的 8u 版本中,即使 G1GC 在空闲堆内存没有被使用时,也不会主动及时归还给 OS,会造成内存资源占用浪费情况。由于 G1 尽可能避免触发 Full GC,因此在许多情况下,除非强制从外部执行 Full GC,否则 G1 不会将空闲的 Java 堆内存释放给操作系统。毕昇 JDK8 通过在 G1 中引入堆内存伸缩特性,在应用程序 CPU 占比不高情况下,定期尝试释放 G1 的空闲堆内存空间给 OS,达到内存资源的最优使用。
特性开启后内存释放示意图:
![](https://www.hikunpeng.com/p/resource/202309/0c60054ab87b42ed8f72d0881968b68c.png)
上图为某业务使能该特性后实测的 JProfile 示意图,可见空闲内存会被平滑释放。在产品线某业务场景下运行 49 个微服务,实测开启 G1 堆内存回收特性比默认 G1GC 的实际物理内存减少 40%。在默认情况下,毕昇 JDK8 不主动开启此功能,对于延迟和吞吐量敏感的业务,不会受到影响。
使能方式:
-XX:+UseG1GC –XX:+G1Uncommit
(4)KAE Provider——支持鲲鹏硬加速/提升加解密速度
KAE 加解密是鲲鹏加速引擎的加解密模块,鲲鹏硬加速模块实现了 RSA/ SM3/ SM4/ DH/ MD5/ AES等算法,提供了高性能对称加解密、非对称加解密算法能力,兼容 openssl1.1.1a 及其之后版本,支持同步和异步机制。毕昇 JDK 8 通过利用 Provider 机制,实现对鲲鹏服务器 KAE 加解密特性的支持,以帮助用户提升在鲲鹏 AArch64 服务器加解密业务的竞争力,特性实现原理可参考下图,详细介绍可参考毕昇 JDK 社区关于 KAE Provider 特性说明。
KAE Provider 特性实现原理:
![](https://www.hikunpeng.com/p/resource/202309/f66d816b00a64c13b1dd757521ced815.png)
该特性在某 web 中间件业务场景中,性能收益较 OpenJDK 原生特性提升90%。
支持算法列表:
算法 | 说明 |
---|---|
摘要算法 |
包括 MD5、SHA256、SHA384、SM3 |
对称加密算法 AES |
支持 ECB、CBC、CTR、GCM 模式 |
对称加密算法 SM4 |
包括 ECB、CBC、CTR、OFB 模式 |
HMac |
包括 HmacMD5、HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA51 |
非对称加解密算法 RSA |
支持512、1024、2048、3072、4096位秘钥大小 |
DH |
包括 DHKeyPairGenerator 和 DHKeyAgreement,支持512、1024、2048、3072、4096位秘钥 |
ECDH |
包括 ECKeyPairGenerator 和 ECDHKeyAgreement,支持曲线secp224r1、prime256v1、secp384r1、secp521r1 |
RSA 签名 |
包括 RSASignature 和 RSAPSSSignature,私钥只支持 RSAPrivateCrtKey |
(5)其他特性
毕昇 JDK 其他特性如:G1GC 支持 Numa-Aware、毕昇 JDK 11 AArch64 版本支持的 ZGC、G1 Full GC 优化、Jmap 支持并行扫描等详情请点击“阅读原文”获取。毕昇 JDK8 和 11 均已开源,并每隔 3 个月进行版本升级和新特性合入,欢迎来毕昇 JDK 开源社区获取最新信息和技术讨论。如果遇到相关技术问题(包括但不限于毕昇 JDK),也可以通过毕昇 JDK 社区进行讨论。
关于鲲鹏 DevKit 开发套件
鲲鹏 DevKit 开发套件是为广大鲲鹏开发者打造的一把屠龙之刃,帮助开发者高效开发,快速迁移。鲲鹏 DevKit 开发套件提供全流程开发工具,集代码迁移、编译调试、性能调优、异常诊断等工具和功能于一体,将开发者的各个工作环节一一串联,提供了一个方便、快捷和专业的工具包。
往期推荐:
![](https://www.hikunpeng.com/p/resource/202309/1b47d7e93cf240a29d219a86d16a5cbd.png)
本页内容