BellSoft 发布带有 CRaC 的 Liberica 以提高应用程序启动速度

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_64AArch64 CPU 架构。
  • 状态存储:CRaC 会存储应用程序的运行时状态,包括 Java 堆、JIT 编译代码、本地内存和设置。
  • 安全性注意事项:开发者需确保存储的状态中不包含敏感数据(如密码)。初始化时会通过 Java 的 Random 类生成种子,恢复后的随机数是可预测的。建议在 afterRestore() 方法中重新生成种子,或使用 SecureRandom 类在快照前清理种子并锁定随机操作,恢复后解除锁定。
  • 协调检查点与恢复:CRaC 确保应用程序在暂停和恢复时能够感知,并会关闭网络连接和文件描述符以提高可靠性。应用程序还可以在未准备好时(例如正在保存用户数据)取消检查点。

使用 CRaC 的步骤

  1. 启动应用程序并指定检查点目录

    $ java -XX:CRaCCheckpointTo=checkpoint-data MyApplication
  2. 创建快照

    $ jcmd MyApplication JDK.checkpoint
  3. 从快照恢复应用程序

    $ 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 等工具的支持。

更多资源

阅读 76
0 条评论