Spring Framework 6.1 的 CDS

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

作为对使用 Spring 提高运行时效率博客文章的后续,我很高兴地分享我们对 Leyden 项目优化的探索,在 JDK 很少使用的 CDS(“类数据共享”)功能方面取得了一些有趣的发现,并已发展成为我们在 Spring Framework 6.1 中发布的新功能。

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

两者都GraalVM 原生镜像Leyden 项目允许 Spring Boot 应用程序在几毫秒内启动。那么,为什么我们应该关心 CDS 呢?我认为我们应该关注三个主要原因:

  • 它是在 OpenJDK 主线中一项成熟且可用于生产的环境的技术,它更容易上手,因为它比 GraalVM 和 Leyden 项目具有更少的约束和副作用。
  • 正如 Brian Goetz 在他在 Devoxx 上关于 Leyden 项目的演讲中提到的那样:“大多数人今天不使用 CDS,但可能应该使用,因为他们可以付出相对较少的努力就能获得合理的启动改进”。
  • 这项技术在每个新的 JVM 版本中都越来越好,而 Leyden 项目的目标是在不久的将来带来更多好处。

让我们一起发现 CDS 能为您的 Spring 应用程序带来什么吧!

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

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

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

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

  • 类路径应指定为常规非嵌套 JAR 的列表。
  • 避免使用目录。
  • 避免使用*通配符字符扩展。

由于 Spring Boot 可执行 JAR 或已记录的解包部署目前并不满足所有这些条件,因此它们尚无法实现最佳 CDS 性能。

这就是为什么,在不对Spring Boot 中可能完成的支持 CDS 的工作做任何假设的情况下,我们一直在与 Stéphane Nicoll 合作开发一种 CDS 友好的解包部署,以便能够获得相关的参考数据点并为 Spring 开发人员提供探索 CDS 支持的方法。请参阅相关的spring-boot#38276问题了解更多详细信息。

如果您想在您的应用程序上使用 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 或 Leyden 项目相比,收益并不那么显著,但您也不必花费大量精力就能获得此好处。因此,如果正确集成,CDS 可能会具有巨大的普及潜力。如果您将 CDS 与 Spring AOT 优化相结合,您可以将 Petclinic 的启动时间缩短 36% 到 42%。

结论

像往常一样,我们正在寻求来自 Spring 社区的反馈,以帮助我们思考更集成体验的潜在下一步。例如,您是否对能够使用 CDS 缓存自动构建经过 Spring Boot 优化的容器感兴趣?

展望未来,Spring 团队将继续与 Java 平台团队合作,探讨如何利用这些改进和发现以及Leyden 项目预先优化,以突破 JVM 运行时效率的界限,同时最大限度地减少 Spring 开发人员和运营商的约束。

干杯!

获取 Spring 新闻通讯

随时关注 Spring 新闻通讯

订阅

领先一步

VMware 提供培训和认证,以快速提升您的进度。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部