JDK 24 中的性能改进

本文总结了 JDK 24 相较于 JDK 23 在性能方面的改进,通过突出一些最值得注意的进展来进行阐述。为了便于追溯,这些改进是按照进入官方 JDK Bug 系统的每个问题(或下面注释中解释的总体问题)列出的。

核心库

  • JDK - 8340821 总体:改进 FFM 批量操作

    • 这是一系列旨在提高 Foreign Function & Memory API(FFM API)性能的一部分,该系列旨在检查参与的段是否“小”,如果是,则使用纯 Java 代码执行批量操作,而不是转换为本地代码。通过三个新的系统属性,可以将分区阈值设置为特定值。
    • 例如,通过MemorySegment::fill方法创建一个填充为0xFF的小段。在 Linux X64 平台上,“Patch”(改进)比“Base”(旧的 Java - 23 分支)快得多,在其他支持的平台和其他批量操作MemorySegment::copyMemorySegment::mismatch上也有类似的特性。
    • 新的批量操作已移至名为jdk.internal.foreign.SegmentBulkOperation的单独类中,操作以long操作、intshortbyte操作的单位执行。
  • JDK - 8336856 高效的基于隐藏类的字符串连接策略

    • 通过利用隐藏类,以更高效的方式生成字符串连接表达式,避免生成中间MethodHandle实例,减少类的数量和其他运行时开销,在启动时提高 40%,运行时类生成减少约一半。
  • JDK - 8333867 SHA3 性能可提高

    • 通过减少字节数组和长数组之间的来回转换,各种 SHA3 算法的性能提高了多达 27%,相关工作可能会在更多平台上实现类似的改进。
  • JDK - 8338542 总体 - 减少与迁移到 ClassFile API 相关的启动开销

    • ClassFile API 在 JDK 24 中即将完成,但在 JDK 23 中已在一些 JDK 库代码中内部使用,几乎所有在运行时生成字节码的机制都将使用它,以简化第三方库的迁移,但此过渡并非完全无痛,JDK 24 已做了很多工作来识别和解决回归问题。

运行时

  • JEP 491 同步虚拟线程而不固定

    • 以前,虚拟线程在同步期间固定在其承载线程上,此 JEP 通过安排在 synchronized构造中阻塞的虚拟线程释放其底层承载线程,用于其他虚拟线程,提高了某些工作负载下的虚拟线程速度,消除了几乎所有虚拟线程固定在承载线程上的情况。
  • JDK - 8180450 二级超级缓存的更好扩展

    • 二级超级缓存(SSC)是一种优化,通过在包含指向超类型指针的类上使用一个元素的缓存来加速某些类型查询,此 PR 放弃了 C2 编译代码的 1 元素超级缓存,而采用哈希表查找,避免了多线程应用程序中的潜在大幅减速。
  • JDK - 8320448 使用 AVX2 加速 IndexOf

    • 此更改将String::indexOf的性能在具有 AVX2 支持的 x64 平台上提高了约 1.3 倍,通过为String::indexOf方法添加内部代码,编译器可以发出能够同时处理更大数据单元的专门 SIMD 机器代码指令,从而提高性能,特别是对于较大的字符串。
  • JDK - 8322295 JEP 475:G1 的后期屏障扩展

    • 此增强功能简化了 G1 垃圾收集器屏障的实现,将其扩展从 C2 JIT 编译管道的早期转移到后期,从而显着减少了 C2 编译的开销,减少了启动和预热应用程序时 JVM 的时间和内存使用量。
  • JEP 483:提前加载和链接类

    • JDK 24 引入了提前加载缓存的概念,它不仅可以存储预解析的类状态,还可以存储加载和链接类后的状态,需要在训练运行期间捕获更多信息,逐步改进基线。

端口

  • RISC - V 改进

    • 在 RISC - V 平台上做了很多工作,包括验证和修复字符串比较、反转字节等操作的性能,实现 CRC32 和 Adler32 内在函数。

其他改进

结论和下一步
感谢 OpenJDK 社区不懈努力提高 Java 的性能,下一步请下载 JDK 24 进行测试,参与社区并提出问题、提交 PR 和参与邮件列表讨论。还有一些关于 Java 24 性能改进的视频。一些人已经在为即将发布的 JDK 25 做新的改进工作。

综上所述,JDK 24 在多个方面进行了性能改进,为 Java 的性能提升做出了贡献。

阅读 24
0 条评论