Spring Framework 6.1 中的 CDS

工程 | Sébastien Deleuze | 2023 年 12 月 4 日 | ...

作为对使用 Spring 提升运行时效率这篇博客文章的跟进,我很高兴地分享,我们对 Project Leyden 优化方案的探索带来了一些有趣的发现,关于 JDK 中鲜为人使用的 CDS(“类数据共享”)特性,并且它已成为我们已集成到 Spring Framework 6.1 中发布的一个新特性。

正如官方文档中所述,类数据共享 (CDS) 通过将类元数据缓存到存档文件中来帮助减少 JVM 的启动时间和内存占用,以便可以快速预加载到新启动的 JVM 中。这加速了类加载,这是影响启动时间的一个重要因素。大多数最新的 JDK 发行版都预打包了一个默认的 CDS 存档,用于包含常见 JDK 类的元数据。您还可以创建自定义的 CDS 存档,以加快您自己应用程序中类的加载速度。

GraalVM native imageProject CRaC 都允许 Spring Boot 应用程序在几十毫秒内启动。那么我们为什么要关注 CDS 呢?我认为有三个主要原因值得关注

  • 它是一项成熟且生产就绪的技术,位于 OpenJDK 主线中,显著地更易于使用,因为它带来的限制和副作用比 GraalVM 和 Project CRaC 更少。
  • 正如 Brian Goetz 在他在 Devoxx 大会上的 Project Leyden 演讲中所说:“今天大多数人不用 CDS,但可能应该用,因为只需相对较少的工作就能获得合理的启动改进”。
  • 这项技术在每个新的 JVM 版本中都变得越来越好,Project Leyden 的目标是在不久的将来增加更多好处。

让我们来了解 CDS 能为您的 Spring 应用程序带来什么!

Spring Framework 6.1 中引入的初始 CDS 支持

Spring Framework 6.1 带来了新的类数据共享文档章节,解释了优化应用程序的两个步骤过程

  1. 通过训练运行创建 CDS 存档是可能的,这得益于新的 -Dspring.context.exit=onRefresh JVM 系统属性,对于大多数用例,这不需要启动 bean 或访问远程服务。
  2. 使用存档以优化生产环境的启动。

为了使 CDS 优化完全有效,您必须确保创建存档和启动应用程序的命令所使用的 JDK 和 classpath 是相同的。另请注意,为了有效地缓存类,

  • classpath 应指定为一个包含常规非嵌套 JAR 的列表。
  • 避免使用目录。
  • 避免 * 通配符扩展。

由于 Spring Boot 可执行 JAR 或文档中提及的解压部署目前尚未满足所有这些条件,因此尚未实现最佳的 CDS 性能。

这就是为什么,在不对Spring Boot 未来如何更集成地支持 CDS 做出任何假设的前提下,我们一直与 Stéphane Nicoll 合作研究一种对 CDS 更友好的解压部署方式,以便获取相关数据点,并为 Spring 开发者提供探索 CDS 支持的途径。更多详情请参见相关的 spring-boot#38276 issue。

如果您想在您的应用程序上使用 CDS 并提供反馈,您可以尝试并借鉴 spring-cds-demo 仓库,其中包含一个自给自足的 unpack-executable-jar.sh 脚本,该脚本以允许最佳 CDS 性能的方式解压 Spring Boot 可执行 JAR。您还可以尝试 Stéphane 创建的优秀 cds-log-parser 工具,以生成报告,指示哪些类是从 CDS 缓存加载的。

Spring Petclinic 的 CDS 数据点

让我们看看能从部署了这些 CDS 优化的著名 Spring Petclinic 应用程序(运行在 Java 21 上,并可选择地与 Spring AOT 优化结合使用)的数据点中学到什么。

Executable JAR, Unpacked, CDS and CDS + Spring AOT

第一个要点与 CDS 无关,并且已经是众所周知并有文档说明的,但值得强调的是:为了获得最佳启动时间,Spring Boot 应用程序的生产部署应该解压。如果您使用 Buildpacks,情况已经是这样了。如果不是,您可能需要检查并可能改进您的自定义部署。

CDS 优化可以将启动时间减少 30% 到 35%,与解压部署相比,只需进行少量限制,即创建一个几十 MB 的 CDS 存档并将其与应用程序一起分发。当然,与 GraalVM 或 Project CRaC 相比,收益没有那么显著,但您也无需做大量工作即可获得此好处。因此,如果得到适当集成,CDS 可能具有广泛应用的巨大潜力。如果您将 CDS 与 Spring AOT 优化相结合,您可以将 Petclinic 的启动时间减少 36% 到 42%。

结论

一如既往地,我们期待 Spring 社区的反馈,以便我们思考如何实现更集成的体验的潜在下一步措施。例如,您是否有兴趣自动构建带有 CDS 缓存的 Spring Boot 优化容器?

展望未来,Spring 团队将继续与 Java 平台团队合作,探讨如何结合Project Leyden premain 优化来利用这些改进和发现,以突破 JVM 运行时效率的极限,同时尽可能减少对 Spring 开发者和运维人员的限制。

祝好!

订阅 Spring 通讯

通过 Spring 通讯保持联系

订阅

先行一步

VMware 提供培训和认证,助您快速提升。

了解更多

获取支持

Tanzu Spring 通过一次简单的订阅,为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

近期活动

查看 Spring 社区中的所有近期活动。

查看全部