快速启动:基于CRaC实现Spring Boot 3恢复预热
内容提要
本教程介绍了使用CRaC实现Spring Boot 3恢复预热的方法,CRaC是一个OpenJDK项目,通过使用CRIU实现了用户空间检查点和恢复功能,可以减少预热时间并保持资源消耗稳定。BellSoft提供了支持CRaC的Liberica JDK和Alpaquita Linux。与GraalVM Native Image相比,CRaC在内存使用量和应用程序文件大小方面表现更好。
延伸解读
CRaC 的适用场景与限制
CRaC 通过检查点/恢复机制,让 Java 应用在预热后保存状态,从而快速启动多个实例,特别适合云原生中需要快速扩展的场景。但 CRaC 仅支持 Linux,且要求检查点前关闭所有文件和网络连接,恢复后重新打开,这需要框架和 JDK 的支持。因此,它并非跨平台通用方案,在非 Linux 系统上只有空操作实现。
CRaC 与 GraalVM Native Image 的取舍
两者都能减少启动时间,但 CRaC 在内存使用和应用程序文件大小上表现更好,而 GraalVM Native Image 支持多操作系统,却限制更多,例如无法在运行时加载任意类、不能运行 Java 代理,且许多可观测性和测试框架不兼容。GraalVM 的故障排除体验可能更昂贵。选择取决于对兼容性和资源效率的权衡。
BellSoft 工具链的集成价值
BellSoft 提供支持 CRaC 的 Liberica JDK 和 Alpaquita Linux,后者是专为 Java 优化的 Linux 发行版,基本映像仅 3.28 MB。其 Alpaquita 容器集成了 CRaC 和 CDS,可显著提升启动速度并减小镜像大小。目前该功能适用于 x86_64 架构的 JDK 17 和 21。这为 Spring Boot 应用提供了即插即用的 CRaC 支持,简化了部署。
检查点前后的资源变化
在检查点前,Liberica JDK 会执行完整的垃圾收集,这有助于减少恢复后的内存占用。教程中通过 pmap 观察 RSS 大小,恢复后 RSS 值低于检查点前,且首次请求后 RSS 会先增加然后稳定,但仍低于转储前的水平。这是因为 HotSpot 在恢复时将部分本机内存返还给操作系统,包括 GC 释放的页面。对于简单应用,这种差异可能不明显。
Q&A
CRaC是什么,它如何改善Java应用程序的启动速度?
CRaC是一个OpenJDK项目,通过用户空间检查点和恢复功能,减少Java应用程序的预热时间,保持资源消耗稳定。
使用CRaC需要哪些环境和工具?
使用CRaC需要Linux环境、支持CRaC的Liberica JDK和Alpaquita Linux。
CRaC与GraalVM Native Image相比有什么优势?
CRaC在内存使用和应用程序文件大小方面表现更好,且不限制某些Java功能。
如何在Spring Boot应用程序中实现CRaC?
在Spring Boot应用程序中实现CRaC需要添加crac包作为依赖,并使用支持CRaC的Alpaquita容器运行应用程序。
CRaC的使用对资源消耗有什么影响?
CRaC可以减少Java应用程序的预热时间,从而在启动时保持资源消耗相对稳定。
Alpaquita Linux在CRaC中的作用是什么?
Alpaquita Linux是专为Java构建并优化的Linux发行版,支持CRaC并提高Java应用程序的启动性能。