Blog chevron_right 未分类

借助 CRaC 缩短 Java 应用程序启动和预热时间

当 Java 应用程序运行时,JVM 会经历加载、初始化和优化应用程序所用代码(包括库、框架和其他组件)的过程,以达到最佳性能水平。应用程序每次重新启动时,不会记录和记忆先前的运行时间及执行的工作,因此必须重启,不仅延长了启动和预热时间,导致时间的浪费,而且占用了宝贵的资源。

加速启动和预热是 Java 长期面临的一项挑战。OpenJDK 的 CRaC(检查点协调还原)项目是最具前景的解决方案之一。Micronaut、Quarkus 和 Spring 等框架已通过 CRaC 实现大幅改进。

开发人员现可亲自试用 CRaC。Azul 今日宣布正式发布适用于 Java 17 的 Azul Zulu 版本 OpenJDK,可在 x86 和 64 位配置中支持 CRaC。这些版本作为 Azul Platform Core 的一部分获得商业支持,也可不受限制地免费下载和使用。

Time to first operation for Micronaut improved from 1 second without CRaC to 46 milliseconds with CRaC.

“CRaC 在 Java 开发者社区引发巨大关注,为改善启动和预热时间提供了令人信服且节约资源的方法。”Micronaut 产品开发主管 Sergio del Amo 表示,“Azul 因发起该项目而闻名,不出所料,他们也将交付业界首个支持商业 CRaC 的生产就绪版本 OpenJDK。”

“CRaC 项目的检查点还原方法有望用于在 JVM 上立即启动 Spring 应用程序。我们与 Azul 的合作已取得良好的初步成果。”Spring Framework 项目的项目负责人兼联合创始人 Juergen Hoeller 透露。

Time to first operation for Spring Boot improved from 4 seconds without CRaC to 38 milliseconds with CRaC.

OpenJDK CRaC 项目定义了公共 Java API,允许在检查点和还原操作期间协调应用程序资源。这一点很重要,因为可以在与创建检查点时不同的环境中还原应用程序,这些环境可能处在不同时区、使用不同的数据库连接字符串等等。

CRaC 允许正在运行的应用程序暂停、拍摄其状态快照并存储以供日后使用,甚至用于其他计算机。系统会将应用程序进程的完整上下文保存为映像,包括其状态和内存。

阅读 CRaC 使用指南

当应用程序稍后重新启动时,将跳过启动和预热,直接跳转至存储的配置文件。系统会快速重新加载整个应用程序及其状态,以便从创建检查点的位置继续运行。这种方法令 Java 应用程序的启动和预热时间缩短了几个数量级,仅为若干毫秒而非以秒或分钟计。

CRaC 允许 Java 应用程序利用检查点和还原机制,并根据需要与其进行协调。检查点和还原操作会将 JVM 和 Java 应用程序的状态保存至映像,随后可在未来某个时间点从该映像恢复 Java 应用程序。就好比在用完笔记本电脑后将其合起,之后再打开时,CRaC 会让笔记本电脑以与合起时相同的性能运行。 

在 2022 年进行的测试中,支持 CRaC 的 OpenJDK 版本展示了令人印象十分深刻的结果:

平台 使用 CRaC 前 使用 CRaC 后
Spring boot 4 秒 38 毫秒
Micronaut 1 秒 40 毫秒
Quarkus 980 毫秒 53 毫秒

了解如何在您的 OpenJDK 版本中获取 CRaC

要将 CRaC 与适用于 Java 17 的 Azul Zulu 版本 OpenJDK 结合使用,请访问我们的下载页面并选择您的版本。您还可以通过我们的网站了解有关 Azul Platform Core 的更多信息。

支持 JDK CRaC 的 Java 17