OpenJDK 项目 CRaC 简介
OpenJDK 项目的 Coordinated Restore at Checkpoint (CRaC) 旨在显著减少 Java 应用程序的启动时间和达到峰值性能的时间。它通过在运行时拍摄内存快照并在后续执行中恢复来实现这一目标。
CRaC 的主要优势
- 减少启动时间和预热时间:CRaC 通过拍摄运行时快照并在后续执行中恢复,大幅减少了 Java 应用程序的启动时间和达到峰值性能的时间。
- 支持框架:Micronaut 和 Quarkus 已经支持 CRaC,Spring Framework 也将在 2023 年 11 月加入支持。
- 性能提升:根据 Azul 提供的基准测试数据,使用 CRaC 后,Micronaut 应用程序的启动时间从 1 秒降至 46 毫秒,Quarkus 应用程序从 1 秒降至 53 毫秒,Spring Boot 应用程序从 3.9 秒降至 38 毫秒。
CRaC 的背景与挑战
- Java 的痛点:Java 语言架构师 Mark Reinhold 指出,Java 的启动时间慢、达到峰值性能的时间长以及内存占用大是长期存在的问题。CRaC 解决了前两个问题,而 GraalVM 的 AOT 编译器可以同时解决这三个问题,但代价是更多的限制和更复杂的故障排除过程。
- 快照机制:通过拍摄 JIT 编译器生成优化机器代码后的快照,可以在恢复时立即获得优化性能。
CRaC 的局限性
- 操作系统限制:CRaC 目前仅支持 Linux 操作系统,因为它依赖于 Linux 的 Checkpoint/Restore In Userspace (CRIU) 功能。在其他操作系统上,CRaC 有一个无操作的实现。
- 文件与网络连接:拍摄快照前需要关闭所有文件和网络连接,并在恢复后重新打开,因此 CRaC 需要在 Java 运行时和框架中提供支持。
CRaC 的实现与使用
- API 支持:CRaC API 允许应用程序在拍摄快照前后执行特定操作。快照可以通过 CRaC API 调用或 Java 工具
jcmd创建。 - 快照恢复:Azul OpenJDK 通过命令行选项
-XX:CRaCRestoreFrom加载快照。
社区与未来展望
- 框架支持:Spring 团队和 CRaC 团队分别提供了使用 CRaC 的 Spring Boot 和 Quarkus 示例项目。
- Azul 的计划:Azul 计划在 JDK 21 发布后不久提供 CRaC 支持。目前尚无其他 Java 发行版计划支持 CRaC。
- 云平台应用:AWS 在 Lambda 无服务器产品中使用 CRaC 加速 Java 代码,但目前尚无其他云平台的具体计划。
CRaC 的成功标准与挑战
- 成功标准:CRaC 的成功在于生产环境中的广泛应用,可以通过 Azul Zulu 构建的 OpenJDK 下载量来衡量。
- 快照的便携性:快照文件的便携性非常有限,只能在相同架构和兼容的微架构上恢复。不同版本的应用程序在相同的运行时配置下也无法跨版本恢复。
开发与调试建议
- 调试与故障排除:对于使用 Windows 或 macOS 的开发者,建议使用 Docker 镜像或虚拟 Linux 机器进行开发。
- 未来展望:CRaC 目前依赖于 Linux 的 CRIU 功能,要实现跨平台支持需要开发等效功能,并且需要说服 OpenJDK 架构师将其纳入主流项目。
其他信息
- 快照性能:恢复快照时,应用程序将获得与拍摄快照时相同的性能水平,因为所有 JIT 编译的代码都包含在快照中。
- 命名争议:CRaC 的发音与一种危险药物相同,但 Azul 的 Simon Ritter 认为这更多是一个玩笑,不会引起混淆。
更多信息可以参考 CRaC 项目网站。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。