此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

JVM 检查点还原

Spring 框架与 Project CRaC 实现的 checkpoint/restore 集成,以允许实现能够使用 JVM 减少基于 Spring 的 Java 应用程序的启动和预热时间的系统。spring-doc.cadn.net.cn

使用此功能需要:spring-doc.cadn.net.cn

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

从概念上讲,checkpoint 和 restore 与SpringLifecycle合同对于单个 bean。spring-doc.cadn.net.cn

正在运行的应用程序的按需检查点/恢复

可以按需创建 checkpoint,例如使用jcmd application.jar JDK.checkpoint.在创建 checkpoint 之前, Spring 会停止所有正在运行的 bean,让它们有机会在需要时通过实现Lifecycle.stop.恢复后,相同的 bean 将重新启动,并使用Lifecycle.start允许 bean 在相关时重新打开资源。对于不依赖 Spring 的库,可以通过实现org.crac.Resource并注册相关实例。spring-doc.cadn.net.cn

利用正在运行的应用程序的检查点/还原通常需要额外的生命周期管理,以正常地停止和开始使用文件或套接字等资源,并停止活动线程。
请注意,当以固定速率定义调度任务时,例如使用@Scheduled(fixedRate = 5000),当使用按需 checkpoint/restore 恢复 JVM 时,将执行 checkpoint 和 restore 之间所有错过的执行。如果这不是您想要的行为,建议以固定的延迟安排任务(例如,使用@Scheduled(fixedDelay = 5000)) 或使用 cron 表达式,因为这些是在每次任务执行后计算的。
如果检查点是在预热的 JVM 上创建的,则还原的 JVM 将同样预热,从而可能立即实现峰值性能。此方法通常需要访问远程服务,因此需要一定程度的平台集成。

启动时自动检查点/恢复

-Dspring.context.checkpoint=onRefreshJVM 系统属性,则会在 在LifecycleProcessor.onRefresh阶段。此阶段完成后,所有非惰性初始化的单例都已实例化,并且InitializingBean#afterPropertiesSet回调已被调用;但生命周期尚未启动,并且ContextRefreshedEvent尚未发布。spring-doc.cadn.net.cn

出于测试目的,还可以利用-Dspring.context.exit=onRefreshJVM 系统属性,该属性 触发类似的行为,但它不是创建一个检查点,而是在相同的生命周期退出你的 Spring 应用程序 阶段,而无需 Project CraC 依赖项/JVM 或 Linux。这对于检查是否连接到远程 当 bean 未启动时,需要 services,并且可能会优化配置以避免这种情况。spring-doc.cadn.net.cn

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