此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.1.10Spring中文文档

Spring Framework 与 Project CRaC 实现的检查点/恢复集成,以便允许使用 JVM 实现能够减少基于 Spring 的 Java 应用程序的启动和预热时间的系统。Spring中文文档

使用此功能需要:Spring中文文档

在请求检查点时指定的路径中生成的文件包含正在运行的 JVM 的内存表示,其中可能包含机密和其他敏感数据。使用此功能时,应假设 JVM “看到”的任何值(例如来自环境的配置属性)都将存储在这些 CRaC 文件中。因此,应仔细评估这些文件的生成、存储和访问位置和方式的安全影响。-XX:CRaCCheckpointTo=PATH

从概念上讲,检查点和恢复与单个 Bean 的 Spring Lifecycle 协定一致。Spring中文文档

在请求检查点时指定的路径中生成的文件包含正在运行的 JVM 的内存表示,其中可能包含机密和其他敏感数据。使用此功能时,应假设 JVM “看到”的任何值(例如来自环境的配置属性)都将存储在这些 CRaC 文件中。因此,应仔细评估这些文件的生成、存储和访问位置和方式的安全影响。-XX:CRaCCheckpointTo=PATH

正在运行的应用程序的按需检查点/还原

可以按需创建检查点,例如使用类似 .在创建检查点之前,Spring 会停止所有正在运行的 bean,让它们有机会在需要时通过实现 来关闭资源。恢复后,将重新启动相同的 Bean,并允许 Bean 在相关时重新打开资源。对于不依赖 Spring 的库,可以通过实现和注册相关实例来提供自定义检查点/恢复集成。jcmd application.jar JDK.checkpointLifecycle.stopLifecycle.startorg.crac.ResourceSpring中文文档

利用正在运行的应用程序的检查点/还原通常需要额外的生命周期管理,以正常停止和开始使用文件或套接字等资源,并停止活动线程。
如果在预热的 JVM 上创建了检查点,则恢复的 JVM 将同样预热,从而立即实现潜在的峰值性能。此方法通常需要访问远程服务,因此需要一定程度的平台集成。
利用正在运行的应用程序的检查点/还原通常需要额外的生命周期管理,以正常停止和开始使用文件或套接字等资源,并停止活动线程。
如果在预热的 JVM 上创建了检查点,则恢复的 JVM 将同样预热,从而立即实现潜在的峰值性能。此方法通常需要访问远程服务,因此需要一定程度的平台集成。

启动时自动检查点/恢复

设置 JVM 系统属性后,将自动在 在阶段内启动。此阶段完成后,所有非延迟初始化的单例都已实例化,并已调用回调;但是生命周期尚未开始,并且尚未发布。-Dspring.context.checkpoint=onRefreshLifecycleProcessor.onRefreshInitializingBean#afterPropertiesSetContextRefreshedEventSpring中文文档

出于测试目的,还可以利用 JVM 系统属性,该属性 触发类似的行为,但它不会创建检查点,而是在同一生命周期退出您的 Spring 应用程序 阶段,不需要 Project CraC 依赖项/JVM 或 Linux。这对于检查是否连接到远程非常有用 当 Bean 未启动时,需要服务,并且可能会优化配置以避免这种情况。-Dspring.context.exit=onRefreshSpring中文文档

如上所述,特别是在 CRaC 文件作为可部署工件(例如容器映像)的一部分交付的用例中,假设 JVM “看到”的任何敏感数据最终都会出现在 CRaC 文件中,并仔细评估相关的安全影响。
自动检查点/恢复是一种将应用程序的启动“快进”到应用程序上下文即将启动的阶段的方法,但它不允许有一个完全预热的 JVM。
如上所述,特别是在 CRaC 文件作为可部署工件(例如容器映像)的一部分交付的用例中,假设 JVM “看到”的任何敏感数据最终都会出现在 CRaC 文件中,并仔细评估相关的安全影响。
自动检查点/恢复是一种将应用程序的启动“快进”到应用程序上下文即将启动的阶段的方法,但它不允许有一个完全预热的 JVM。