利用 CRaC,将 Java 应用程序恢复启动时间缩短到几毫秒
BellSoft发布 了带有 检查点协调恢复(全名 Coordinated Restore at Checkpoint,缩写 CRaC)功能的 17 和 21 版 Liberica JDK。该特性允许开发人员在任何时间点(检查点)为正在运行的应用程序创建快照。然后,他们可以使用该快照通过恢复应用程序的状态在几毫秒内启动应用程序。
CRaC 基于 Linux 特性用户空间检查点和恢复(全名 Checkpoint and Restore in Userspace,缩写 CRIU),这意味着这些构建只适用于运行 Linux 操作系统的 x86_64 和 AArch64 CPU 架构。CRIU 提供检查点和恢复功能,并被 Docker、Podman 等各种解决方案所使用。
CRaC 会存储正在运行的应用程序的状态,包括 Java 堆、JIT 编译代码、本机内存和设置。开发人员应确保存储的状态中没有密码等敏感数据。初始化期间会通过 JavaRandom
类生成种子,这意味着快照恢复时的随机数是可预测的。为了实现随机性,可以在恢复之后在afterRestore()
方法中创建一个新的种子。更好的解决方案是使用 Java SecureRandom
类在快照之前清除种子并锁定随机操作,然后在afterRestore()
方法中删除锁定。
协调检查点和恢复可以确保应用程序知道它正在暂停和重新启动。这可以确保网络连接和打开的文件描述符已关闭,使得这个过程更加可靠。该过程还允许应用程序在还没有准备好时(例如正在保存用户数据)取消检查点。
可以使用以下命令启动MyApplication
并指定 checkpoint-data 目录。该目录将包含创建快照时的 JVM 数据:
java -XX:CRaCCheckpointTo=checkpoint-data MyApplication
现在,可以使用 jcmd 命令创建一个快照了:
jcmd MyApplication JDK.checkpoint
之后,可以通过恢复 checkpoint-data 目录下快照的状态来启动应用程序:
java -XX:CRaCRestoreFrom=checkpoint-data
其他加速启动应用程序的解决方案,例如 GraalVM 使用的提前(AOT)编译和 Quarkus 使用的应用程序类数据共享(AppCDS),也可以提供快速启动。但是,这些解决方案不支持在运行时使用 JIT 编译器进行进一步优化。
Bellsoft 建议,CRaC 主要用于具有以下特征的应用程序:短时间运行、低 CPU 限值、复制并频繁重启。
CRaC 最初由 Azul 开发,现已成为 OpenJDK 的一个项目。Azul 还在他们自己的 OpenJDK 下游发行版 Zulu 中包含了 CRaC。CRaC 正变得越来越 主流,并得到 Spring Boot、Quarkus、Micronaut 和 AWS Lambda SnapStart 等工具的支持。
要了解更多在普通 Java 应用程序和 Spring Boot 应用程序中使用 CRaC 的信息,可以查阅 Bellsoft 性能架构师 Dmitry Chuyko 撰写的博文“如何在 Java 应用程序中使用 CRaC”。
原文链接:
https://www.infoq.com/news/2023/12/bellsoft-liberica-crac/
声明:本文由 InfoQ 翻译,未经许可禁止转载。
发布 Vue3 让尤雨溪吃尽苦头:犯了3个错,每一个都需开发者警惕
阿里被判向京东赔偿10亿;要求销毁 ChatGPT,微软和 OpenAI被起诉;阿里云大调整:混合云部分团队裁员30%|Q资讯
微信扫码关注该文公众号作者