BellSoft 发布支持 CRaC 的 Liberica JDK 17 和 21 版本
BellSoft 发布了 Liberica JDK 的 17 和 21 版本,这两个版本是其 OpenJDK 的下游发行版,并引入了 Coordinated Restore at Checkpoint (CRaC) 功能。CRaC 允许开发者在应用程序运行的任意时刻创建快照(checkpoint),并在需要时通过恢复应用程序状态实现毫秒级启动。
CRaC 的核心功能
- 基于 CRIU:CRaC 基于 Linux 的 Checkpoint and Restore in Userspace (CRIU) 功能,因此目前仅支持运行在 Linux 操作系统上的 x86_64 和 AArch64 CPU 架构。
- 状态存储:CRaC 会存储应用程序的运行时状态,包括 Java 堆、JIT 编译代码、本地内存和设置。
- 安全性注意事项:开发者需确保存储的状态中不包含敏感数据(如密码)。初始化时会通过 Java 的
Random类生成种子,恢复后的随机数是可预测的。建议在afterRestore()方法中重新生成种子,或使用SecureRandom类在快照前清理种子并锁定随机操作,恢复后解除锁定。 - 协调检查点与恢复:CRaC 确保应用程序在暂停和恢复时能够感知,并会关闭网络连接和文件描述符以提高可靠性。应用程序还可以在未准备好时(例如正在保存用户数据)取消检查点。
使用 CRaC 的步骤
启动应用程序并指定检查点目录:
$ java -XX:CRaCCheckpointTo=checkpoint-data MyApplication创建快照:
$ jcmd MyApplication JDK.checkpoint从快照恢复应用程序:
$ java -XX:CRaCRestoreFrom=checkpoint-data
与其他快速启动方案的对比
- AOT 编译(如 GraalVM)和 AppCDS(如 Quarkus)也支持快速启动,但这些方案不支持运行时通过 JIT 编译器进行进一步优化。
- 适用场景:BellSoft 建议 CRaC 主要用于具有以下特点的应用程序:运行时间短、CPU 限制低、需要复制和频繁重启。
CRaC 的生态系统
- 开源项目:CRaC 最初由 Azul 开发,现已成为 OpenJDK 项目之一,并被 Azul 集成到其 OpenJDK 发行版 Zulu 中。
- 主流支持:CRaC 正逐渐成为主流,得到了 Spring Boot、Quarkus、Micronaut 和 AWS Lambda SnapStart 等工具的支持。
更多资源
- BellSoft 的性能架构师 Dmitry Chuyko 撰写了关于如何在常规 Java 应用和 Spring Boot 应用中使用 CRaC 的详细博客:How to use CRaC with Java applications。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。