试用CRaC SpringBoot 3.3.5 启动速度优化3到10倍
当天和小同伴们来聊一个稍微新一点的技术话题---CRaC。
CRaC(Coordinated Restore at Checkpoint,审核点协调复原)是一个 OpenJDK 名目,旨在处置 Java 运行程序启动和预热期间过长的疑问。
Java 运行程序启动和预热期间过长是一个老大难的疑问,目前来看各方也都提出了一些不同的处置思绪,之前松哥和大家聊过的 AOT 也能从必定水平上处置启动慢的疑问,当天的 CRaC 算是另外一种处置思绪。
一、CRaC是什么
CRaC 准许对运转中的 JVM 启动“快照”,并将其形态(包括运行)存储到磁盘中。
之后,在另一个期间点,可以将 JVM 从保留的审核点复原到内存中。
这个配置象征着你可以启动运行程序、预热并创立审核点,而后从这个审核点极速复原,从而清楚缩小启动期间。
二、CRaC的原理
CRaC 的上班原理基于用户空间审核点和复原(CRIU),这是一个为 Linux 成功审核点和复原配置的名目。
CRIU 准许解冻容器或单个运行程序并从保留的审核点文件中复原它。
CRaC 驳回了 CRIU 的通用方法,并参与了一些增强和调整,使其适用于 Java 运行程序。
普通来说,CRaC 的口头步骤如下:
这个觉得就有点相似于大伙往经常常使用的 VMWare 的快照配置,在某个期间点为系统拍摄一个快照,下次可以间接从快照启动,就比从头开局启动要快很多。CRaC 所拍快照中不只蕴含 JVM,也可以蕴含你的运行信息。
三、CRaC 的运行场景
CRaC 特意适用于须要极速启动和复原的场景,比如:
四、支持版本
从 Spring Boot3.2/Spring6.1 开局对 CRaC 的提供支持,所以假设大伙想体验 CRaC,须要选用适宜的 SpringBoot 版本。
同时,由于前文提到的 CRaC 依赖于 Linux 特有的 CRIU,因此 CRaC 目前仅在Linux操作系统上支持。Windows 和 Mac 则不支持。
五、通常
首先咱们须要装置支持 CRaC 的 JDK,目前关键有以下两种 JDK 支持 CRaC:
接上去在名目中参与 CRaC 依赖:
<dependency><groupId>org.crac</groupId><artifactId>crac</artifactId><version>1.5.0</version></dependency>
OK,如此之后,咱们的预备上班就算成功了。
接上去咱们须要在名目启动的时刻,指定审核点的位置,并给出世成审核点的机遇:
java -Dspring.context.checkpoint=onRefresh -XX:CRaCCheckpointTo=./tmp_checkpoint -jar javaboy-crac-3.3.5.jar
在下面的启动脚本中,咱们经过设置 JVM 系统属性 -Dspring.context.checkpoint=onRefresh 来启用智能审核点。这个属性会在 Spring 的 LifecycleProcessor.onRefresh 阶段智能创立审核点,这个阶段在一切非提前初始化的 Singleton 实例化和 InitializingBean#afterPropertiesSet 回调调用之后,但在生命周期启动和 ContextRefreshedEvent 颁布之前。也就是说在这个机遇创立审核点(拍摄快照)。
当然,假设你想等运行程序齐全启动之后再拍摄快照,也是可以的。
先用如下命令启动运行程序:
java -XX:CRaCCheckpointTo=./tmp_checkpoint -jar javaboy-crac-3.3.5.jar
期待运行程序齐全启动后,在另一个终端口头以下命令来手动触发审核点:
jcmd <pid> JDK.checkpoint
其中 <pid> 是运行程序的进程ID,这将创立审核点并封锁运行程序。审核点文件将存储在指定的文件夹中。
手动口头审核点生成的好处是,这个审核点蕴含了框架代码和运行程序代码,因此启动速度会更快,由于框架曾经加载并启动了运行程序。
无论哪种模式生成审核点,只需有了审核点,最后一步就是经常使用这个审核点了。
咱们可以应用审核点生成的文件来极速拉起运行程序,关系命令如下:
java -XX:CRaCRestoreFrom=./tmp_checkpoint
总结下就是,智能审核点适宜极速成功和无需代码更改的场景,而手动审核点提供了更大的灵敏性,准许在运行程序齐全预热后创立审核点,从而或者成功更快的启动期间。
好啦,感兴味的小同伴可以去尝试下,记得选用适宜的操作系统、JDK 版本以及 Spring Boot 版本哦~