Spring 6.1类数据共享 (CDS) 可提高启动速度


GraalVM 原生镜像和Project CRaC都允许 Spring Boot 应用程序在几十毫秒内启动,类数据共享CDS是第三种代价最小的方法

类数据共享(CDS)通过将类元数据缓存在存档文件中,以便可以快速预加载到新启动的 JVM 中,从而帮助减少 JVM 的启动时间和内存占用。这会加速类加载,这是启动时间的一个重要因素。

默认 CDS 存档与最新的 JDK 发行版一起预打包,以包含常见 JDK 类的元数据。您还可以创建自定义的 CDS 存档以加快您自己的应用程序中类的加载速度。

CDS相比GraalVM 和 Project CRaC有主要优点:

  • 它是 OpenJDK 主线中成熟且可投入生产的技术,明显更易于使用,因为它比 GraalVM 和 Project CRaC 具有更少的限制和副作用。
  • 大多数人现在不使用 CDS,但最可能应该使用,因为他们可以通过相对较少的工作就能获得合理的启动改进
  • 该技术在每个新的 JVM 版本中都在变得越来越好,Leyden 项目的目标是在不久的将来增加更多的好处。

让我们来看看 CDS 能为Spring 应用程序带来什么!

Spring Framework 6.1 中引入了初始 CDS 支持
Spring Framework 6.1 带来了新的类数据共享文档部分,解释了优化应用程序的两个步骤过程:

  1. 由于新的-Dspring.context.exit=onRefreshJVM 系统属性,通过训练运行创建 CDS 存档成为可能,对于大多数用例来说,它不需要启动 Bean 或访问远程服务。
  2. 使用存档来优化生产启动。

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

另请注意,要有效地缓存类:

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

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

如果您想在应用程序上使用 CDS 并提供反馈,您可以尝试从spring-cds-demo存储库中获取灵感,该存储库包含一个独立的unpack-executable-jar.sh脚本,该脚本可在以下位置unpack解压 Spring Boot 可执行 JAR:一种允许最佳 CDS 性能的方法。

Spring Petclinic 的 CDS 数据点
Spring Petclinic在 Java 21 上运行的 CDS 优化,并且可以选择与 Spring AOT 优化相结合。

与解包部署相比,CDS 优化可将启动时间缩短 30% 至 35%,而创建一个包含几十个 Mb 的 CDS 压缩包并将其发送到应用程序中仅是很小的限制。

当然,这种收益并不像 GraalVM 或 Project CRaC 那样显著,但您也不必做大量工作就能获得这种好处。

因此,如果集成得当,CDS 有可能被广泛采用。如果将 CDS 与 Spring AOT 优化相结合,可以将 Petclinic 的启动时间缩短 36% 到 42%。