CRaC还原checkpoint内存快照 加速Java应用启动
🕗2024-07-13👁️8
CRaC
Coordinated Restore at Checkpoint,译成中文即:从检查点原样恢复重启。
大致的原理是将JVM的当前运行状态进行持久化存储起来,相当于存储某一刻运行时的快照,给那一刻的JVM运行状态进行拍照即为检查点。再启动服务时直接通过该快照文件恢复至运行状态。通过检查点恢复启动的速度比原始启动要快不少,从而实现缩短应用启动速度。
条件
- 操作系统:得有CRIU功能,CRIU(Checkpoint/Restore In Userspace),目前只有Linux系列的OS有该功能。
- JDK版本: 17及以上,建议17或21
- OpenJDK发行版,目前支持CRaC的JDK有两家:
- Zulu JDK: 发行商为Azul,下载地址:https://www.azul.com/downloads/?version=java-17-lts&os=centos&architecture=x86-64-bit&package=jdk-crac#zulu
- Liberica JDK: 发行商为Bellsoft,下载地址:https://bell-sw.com/pages/downloads/?version=java-17&os=linux&bitness=64&package=jdk-crac&release=17.0.11%2B13
- Spring Boot: 3.2.x及以上
引依赖
<dependency>
<groupId>org.crac</groupId>
<artifactId>crac</artifactId>
<version>1.4.0</version>
</dependency>
开启CRaC参数
/app/jdk-21.0.3-crac/bin/java -jar -Dspring.context.checkpoint=onRefresh -Djdk.crac.resource-policies=crac.yml -XX:CRaCCheckpointTo=checkpoint myapp.jar &
/app/jdk-21.0.3-crac/bin/java
这里使用的是JDK绝对路径,以方便一机多个JDK共存并在运行app时指定CRaC功能的JDK进行运行。-Dspring.context.checkpoint=onRefresh
是spring触发检查点的时机。-Djdk.crac.resource-policies=crac.yml
指定检查点触发时不进行转存储的状态的配置文件,主要有三类(文件、socket、pipe)-XX:CRaCCheckpointTo=checkpoint
是指定把检查点触发的快照文件存储的目录
crac.yml
type: socket
localAddress: *
remoteAddress: *
localPort: *
remotePort: *
family: ip
action: ignore
---
type: file
path: /opt
action: ignore
---
type: file
path: /tmp
action: ignore
---
type: pipe
action: ignore
关于crac.yml配置文件格式及值的说明,详见: