快速启动:基于CRaC实现Spring Boot 3恢复预热

💡 原文中文,约7000字,阅读约需17分钟。
📝

内容提要

本教程介绍了使用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应用程序的启动性能。

🏷️

标签

➡️

继续阅读