什么是CRaC
aboullaite.me/what-the-crac/
出自Azul system,也是基于CRIU技术的一个java 进程保存,恢复的技术
azul.com/products/components/crac/
目前open jdk 17 集成了CRaC
其他更高版本没有,需要使用Azul版本的OPEN JDK版本才行
使用spring boot 3.2 + jdk 17进行CRaC 验证:
my.oschina.net/klblog/blog/10946547
总结
CRaC 当前只是初步支持,有些场景:比如内存里维护了复杂状态的应用,可能会遇到问题,启用前请谨慎做好全场景的测试。
遇到的问题
1、JDK 依赖问题
CRaC 特性依赖 JDK 特性支持,目前 openjdk 发行版只支持到 JDK17。如果在不支持的 JDK 下启用 CRaCCheckpointTo
,则会输出:
Unrecognized VM option 'CRaCCheckpointTo'
Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
CRaC 最早是 Azul 发起的一个项目,可以用 Azul 的社区发行版来验证 CRaC 特性,如:
-
docker image:azul/zulu-openjdk:21-jdk-crac
2、GC 算法问题
ZGC 算法下,不支持 CRaC,在 ZGC 启用时,会输出:
Error: Could not create the Java Virtual Machine.Error: A fatal exception has occurred. Program will exit.
-XX:+UseZGC is currently unsupported for -XX:CRaCCheckpointTo.
为了验证 CRaC 功能,只好先移除 -XX:+UseZGC
3、打开的 FD & Socket 问题
CRaC 要求应用程序关闭所有打开的文件、网络连接等。在 Linux 上,这些内容表示为文件描述符。但是,可能很难更改应用程序以与检查点正确协调,例如,由于无法修改库中的代码。在这些情况下,CRaC 通过配置提供有限的处理。
理论上所有的资源都需要向 JVM 注册资源的 Checkpoint 前后的资源状态,Spring 内置的依赖都处理好了这一步,但是三方依赖就会有一些异常
-
Openjdk 发行版并未全部覆盖支持,目前支持的最高版本是 JDK17。更高版本的支持只能用 Azul 的 JDK
-
当前还有非常多的集成问题,且大量第三方包并没有做适配,Azul 官方给的 resource-policies 解决方案还属于初步阶段
-
Spring Boot 3.2 也是初步支持,Issue 区有大量集成的问题