龙芯在此荣幸宣布基于OpenJDK 17的龙芯平台Java环境发布。Java 17提供了数千种性能、稳定性和安全性更新,以及14个JEP(JDK Enhancement Proposal,即JDK增强建议)来进一步优化Java语言和平台,从而帮助开发人员提高工作效率。Java 17是Oracle最新发布的长期支持 (Long-Term Support, LTS) 版本[1]。Java 17新增的JEP包括:

  • JEP 306: Restore Always-Strict Floating-Point Semantics
  • JEP 356: Enhanced Pseudo-Random Number Generators
  • JEP 382: New macOS Rendering Pipeline
  • JEP 391: macOS/AArch64 Port
  • JEP 398: Deprecate the Applet API for Removal
  • JEP 403: Strongly Encapsulate JDK Internals
  • JEP 406: Pattern Matching for switch (Preview)
  • JEP 407: Remove RMI Activation
  • JEP 409: Sealed Classes
  • JEP 410: Remove the Experimental AOT and JIT Compiler
  • JEP 411: Deprecate the Security Manager for Removal
  • JEP 412: Foreign Function & Memory API (Incubator)
  • JEP 414: Vector API (Second Incubator)
  • JEP 415: Context-Specific Deserialization Filters

关于Java 17更详细的内容请见https://www.oracle.com/java/technologies/javase/17u-relnotes.html

龙芯平台关键更新

此次新发布的版本,除了上述上游更新以外,龙芯团队针对龙芯平台特别是LoongArch平台进行了新功能开发和优化,具体如下:

符合TCK标准

龙芯平台Java 17环境经过验证符合Java SE 17,新应用程序和现有应用程序无需修改即可运行。

C1和分层编译支持

C1编译器即Client Compiler,主要特点是较低的启动耗时和较小的内存占用。C2编译器即Server Compiler,主要特点是较高的峰值性能。综合了解释器、以及C1和C2的优点,HotSpot引入了分层编译(Tiered Compilation)技术,将执行方式划分为多个级别。

C2编译器主要是满足了Java应用的峰值性能需求,此次发布的LoongArch64平台环境支持C1编译器和分层编译,可进一步满足对启动性能有要求的Java应用,比如桌面应用。通过实测,龙芯平台开启C1和分层编译之后,部分应用得到了显著提升:Eclipse启动时间减少16.4%,NetBeans启动时间减少20.1%,SPECjvm2008中的startup项提升13.4%,Dacapo中luindex和fop用时分别降低31.9%和29.2%,SPECjbb2015 max-jOPS提升2.8%。

向量指令优化

此次版本通过使用LoongArch向量指令对C2编译器进行了自动向量化优化,同时还进行了Vector API的硬件支持。通过实测,开启向量优化后,在LoongArch64平台上SPECjvm2008中的scimark.lu.small提升了102.7%,JMH Microbenchmarks含有Vector关键字的168项测试中,计时类测试中有39项用时降低1/2以上,吞吐量类测试中有26项提升2倍以上、其中最高项提升了298倍。

ZGC支持

ZGC(The Z Garbage Collector),是一款低延迟垃圾回收器,它的设计目标包括[2]:

  • 亚毫秒级最大停顿时间
  • 暂停时间不随堆的大小、存活集及根集的大小的增加而增加
  • 支持8MB至16TB级别的堆大小

通过实测,龙芯平台(LoongArch64)开启ZGC后,在3C5000L双路上SPECjbb2015 max-jOPS提升27.8%,critical-jOPS提升200%以上。

size:991,582

加解密类优化

此次版本通过Intrinsics方式使用LoongArch基础指令对SHA1、SHA256、AES、MD5以及CRC32相关API进行优化[1]。这些优化对SPECjvm2008中的crypto等项目有显著提升效果。

数组拷贝优化

此次版本针对LoongArch进行了数组拷贝相关Stub的重构和优化[2]。通过JMH Microbenchmarks测试显示,org.openjdk.bench.java.lang.ArrayCopy相关测试用例优化后平均执行时间下降33%,最多项下降了76.77%,SPECjvm2008中的serial项优化后提升了6%以上。

原子指令优化

此次版本通过使用LoongArch原子访存指令减少了内存屏障指令的使用,对volatile相关操作实现了优化。

其他

除了上述优化以外,此次发布的版本还包含针对龙芯平台的一些故障修复。这些优化和故障修复中的部分内容已集成至龙芯平台低版本JDK中,更多内容会根据情况陆续集成至低版本JDK中。

[1][2] 部分优化已在低版本中集成发布,见8.1.8发行注记