领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多Spring Boot 开发人员如何以最少的约束来提高其应用程序的运行时效率,以便在大多数应用程序上享受这些好处?答案是 Spring Boot 3.3 引入的 CDS 支持,它允许您更快地启动 Spring Boot 应用程序并消耗更少的内存。它基于几个月前我介绍的 Spring Framework 6.1 中引入的基础。
关键一点是,与GraalVM 原生镜像支持相比,这种新的 CDS 支持提供了不同的价值主张:例如,使用 CDS 获得的启动时间改进不如原生镜像那样显著,但它们仍然非常重要,同时您可以继续使用您的常规 JVM,并且几乎没有副作用。
Spring Boot 以生产就绪的方式支持 CDS 和 GraalVM 原生镜像,并根据您的上下文和意见提供选择。
CDS 代表类数据共享,它是一项成熟的技术,已经在大多数 JVM 中可用并使用,但到目前为止尚未充分发挥其潜力。简单来说,您可能已经在不知情的情况下使用了 CDS,但仅用于优化 JDK 类加载,而您的应用程序或库的类可能没有利用它。要解锁它,需要对您的应用程序执行训练运行。
您还需要满足一系列约束条件,如果没有像 Spring Boot 这样的专用支持,这些约束条件很容易被破坏。
*
通配符和嵌套 JAR。Spring Boot 3.3 通过提供 2 个新功能来释放这种潜力:自解压可执行 JAR 和构建包 CDS 支持。
直接使用可执行 JAR 运行 java -jar my-app.jar
不是在生产环境中运行应用程序的最有效方式。这已记录在案,但大多数不使用构建包的开发人员和操作员都错过了这一点,这是我与 Spring 社区讨论的各种结果。并且直到最近,还没有真正的一流功能来提供帮助。
Spring Boot 3.3 改变了这一点,并引入了可执行 JAR 自解压的功能,而无需任何外部工具,只需使用可能已可用于运行应用程序的 java 命令。
java -Djarmode=tools -jar my-app.jar extract --destination application
然后,您可以使用以下方法更有效地运行您的 Spring Boot 应用程序:
java -jar application/my-app.jar
此功能具有强大的功能:它旨在满足 CDS(和 Project Leyden)约束。因此,结合 Spring Framework 对 CDS 训练运行的支持,您可以为您的 Spring Boot 应用程序创建 CDS 存档,如下所示:
java -XX:ArchiveClassesAtExit=application.jsa -Dspring.context.exit=onRefresh -jar application/my-app.jar
然后,您可以使用 CDS 启用启动应用程序:
java -XX:SharedArchiveFile=application.jsa -jar application/my-app.jar
自解压可执行 JAR 功能与 CDS 使用相结合非常灵活,但仍然需要相当多的手动步骤,因此 Spring Boot 和构建包提供了集成的 CDS 支持,它可以:
如https://github.com/sdeleuze/spring-boot-cds-demo 存储库中所示,可以使用 Gradle 启用它:
tasks.named("bootBuildImage") {
environment["BP_JVM_CDS_ENABLED"] = "true"
}
或使用 Maven:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<image>
<env>
<BP_JVM_CDS_ENABLED>true</BP_JVM_CDS_ENABLED>
</env>
</image>
</configuration>
</plugin>
在训练运行期间,Spring bean 会在不启动 Spring 生命周期的情况下实例化,因此在实践中,您可能会观察到的主要副作用是早期数据库交互,可以通过配置您的应用程序(或仅使用 CDS_TRAINING_JAVA_TOOL_OPTIONS
环境变量配置训练运行)来避免此类数据库交互,如此处所述。
也可以使用 BP_SPRING_AOT_ENABLED
环境变量触发 Spring AOT 激活支持,但请务必牢记这些约束条件。
CDS_TRAINING_JAVA_TOOL_OPTIONS
和 BP_SPRING_AOT_ENABLED
不能组合使用。Broadcom 的 Spring 和构建包团队一直在紧密合作,以利用这些 OSS 功能并将其与其他Tanzu Platform 功能结合起来,以便为 Cloud Foundry 或 Kubernetes 提供一流的 CDS 支持,例如训练运行自动配置,使 CDS 就像一个标志一样易于启用,并且没有任何副作用,以及更多平台级功能即将推出。
在 MacBook M2 上运行的最小 Spring MVC Tomcat 应用程序中,我们观察到提取的应用程序与 CDS 相结合,与运行可执行 JAR 相比,启动速度大约快 1.5 倍,内存消耗降低了 16%。如果我们将 Spring AOT 添加到混合中,我们将获得大约 2 倍的启动速度和 27% 的内存消耗降低。
我们在 Petclinic 中看到了类似的改进。
这些值在功能较弱的云实例上显然会发生变化,但您应该可能会观察到类似的改进比率。
有趣的是,上面描述的新提取命令使用的 CDS 友好布局也旨在为Project Leyden 早期访问版本提供最佳性能,它可以被视为 CDS 的后继者,具有其他功能,例如:
我们目前观察到,使用 Project Leyden 的 Spring Boot 应用程序启动速度大约快 3 倍,并且在结合使用 Project Leyden 和 Spring AOT 时,启动速度快 4 倍。
我将在即将举行的2024 年比利时 Devoxx 上的 Project Leyden 演讲中分享更多信息,届时我将荣幸地与来自 Java 平台团队的 Per Minborg 共同发表演讲。