Spring Boot 3.2 + CRaC = 王炸!

前段时间发布了 Spring 6.1 和 SpringBoot 3.2,它们都完全支持 CRaC(检查点协调恢复)。

如果你想了解有关 CRaC 的更多信息,请随时阅读此处:

https://docs.azul.com/core/crac/crac-introduction

CRaC 是一个 OpenJDK 项目,可以“快照”正在运行的 JVM(Java 虚拟机)并将其状态(包括你的应用程序)存储到磁盘。然后,在另一个时间点,你可以将 JVM 从保存的检查点恢复到内存中。这样,我们就可以启动应用程序、预热它并创建检查点。从保存的检查点恢复到内存主要依赖于磁盘I/O,这意味着它非常快(在毫秒范围内)。

先决条件

要在 SpringBoot 3.2 中使用 CRaC,你需要具备三件事:

  • 支持 CRaC 的 JVM

  • org.crac 的依赖项

  • 可以存储检查点的文件夹

Spring Boot 基础就不介绍了,推荐看这个实战项目:

https://github.com/javastacks/spring-boot-best-practice

JDK

使用的 JDK(Java 开发工具包)是 Azul Zulu 21.0.1 + CRaC,你可以在此处获取:

https://www.azul.com/downloads/?os=linux&package=jdk-crac#zulu

JDK 适用于 x64 和 aarch64 CPU 架构以及 JDK 17 和 JDK 21。

推荐阅读:Java 8 腰斩!Java 17 暴涨 430%!!

权限

可能需要设置权限才能使用 CRIU,这意味着在运行演示的 Linux 机器上,你需要执行一次以下命令:

sudo chown root:root $JAVA_HOME/lib/criu
sudo chmod u+s $JAVA_HOME/lib/criu

org.crac。

将 petclinic 存储库克隆到本地计算机并添加对 org.crac 库的依赖项。

由于 CRaC 目前仅在 Linux 上可用,因此你找不到支持 MacOS 和 Windows 的 CRaC 的 JDK。这意味着如果你使用的是 Mac 或 Windows 计算机,则无法针对 CRaC API 进行编码。为了解决这个问题,org.crac 库提供了与支持 CRaC 的 JDK 中可用的相同 API,但你将在“org.crac”命名空间中找到它,而不是使用“jdk.crac”命名空间。

这样,即使在 MacOS 和 Windows 上,你也可以针对 CRaC API 进行编码,而不会出现任何问题,并且一旦你在具有启用 CRaC 的 JDK 的 Linux 系统上运行它,它将使用 CRaC 功能。

你可以在 Maven Central 上找到 org.crac ,因此你可以添加依赖,如下所示:

Gradle:

implementation 'org.crac:crac:1.4.0'

Maven:

<dependency>
  <groupId>org.crac</groupId>
  <artifactId>crac</artifactId>
  <version>1.4.0</version>
</dependency>

为检查点创建一个文件夹

在我们测试之前,我们需要确保我们有一个可以存储检查点的文件夹,例如 /tmp_checkpoint 在项目文件夹中。

不使用 CRaC 启动

克隆 petclinic 存储库后,你需要构建项目(例如 gradlew clean build),然后就可以运行它。

我们唯一感兴趣的是应用程序的启动时间。我对两个 JDK 版本(17 和 21)进行了测试,首先,只需从 17 切换到 21,petclinic 应用程序的启动时间就已经缩短了 500 毫秒!

因此,如果可能的话,你应该尽快切换 JDK,以获得更好的性能。

通过执行以下命令启动应用程序:

java -jar spring-petclinic-3.2.0.jar

以下是在不使用 CRaC 的情况下启动应用程序时的结果:

图片

好的,快了大约 500ms,但启动仍然需要一些时间,所以让我们看一下 SpringBoot 3.2 中实现的另一种方法。

自动检查点

Spring 团队的工程师有一个好主意,通过在应用程序启动之前自动创建检查点来缩短 Spring/SpringBoot 框架的启动时间。

这是文档中的描述:

“当设置 -Dspring.context.checkpoint=onRefresh JVM 系统属性时,在 LifecycleProcessor.onRefresh 阶段启动时会自动创建一个检查点。此阶段完成后,所有非延迟初始化的单例都已实例化,并且 InitializingBean# afterPropertiesSet 回调已被调用;但生命周期尚未开始,并且 ContextRefreshedEvent 尚未发布。”

为了使用自动检查点,我们按如下方式启动应用程序:

java -Dspring.context.checkpoint=onRefresh -XX:CRaCCheckpointTo=./tmp_checkpoint -jar spring-petclinic-3.2.0.jar

执行应用程序后,它将创建检查点,并将检查点文件存储在文件夹 ./tmp_checkpoint 中,然后退出应用程序。

现在你可以通过执行以下命令从检查点恢复应用程序(这意味着再次启动它):

java -XX:CRaCRestoreFrom=./tmp_checkpoint

以下是从自动检查点恢复时与启动时间相关的结果

图片

这非常酷,我们的启动时间比原始启动时间快一个数量级,而无需更改代码。这也意味着检查点仅包含框架代码,而不包含你的应用程序代码,因为它尚未启动。

手动检查点

自动检查点已经是与启动时间相关的一个很大的改进,但我们甚至可以通过使用手动检查点来更快。

使用手动检查点时,你可以决定何时创建检查点。

为什么这很重要?

好吧,你可能想在 10 分钟后或当你的应用程序完全预热(大多数/所有代码已编译和优化)等时创建一个检查点。

创建手动检查点的过程与自动检查点类似,唯一的区别是你从应用程序外部触发检查点,而不是让框架自动创建检查点。

在开始之前,请确保检查点的文件夹为空。

首先,你按如下方式启动你的应用程序:

java -XX:CRaCCheckpointTo=./tmp_checkpoint -jar spring-petclinic-3.2.0.jar

现在,你需要等待应用程序完全启动,然后再打开第二个 shell 窗口。

在第二个 shell 窗口中,执行以下命令:

jcmd spring-petclinic-3.2.0.jar JDK.checkpoint

现在你应该看到在第一个 shell 窗口中(你启动 petclinic 应用程序的位置)创建了一个检查点并且应用程序已关闭。

你可以通过验证文件夹 ./tmp_checkpoint 是否包含检查点文件来检查应用程序是否已设置检查点。

现在你可以关闭第二个 shell 窗口。

要从此检查点恢复应用程序,请执行与自动检查点相同的命令:

java -XX:CRaCRestoreFrom=./tmp_checkpoint

这个手动触发的检查点不仅包含框架代码,还包含应用程序代码,这意味着我们应该看到更快的启动,因为应用程序已经由框架加载并启动。结果如下:

图片

正如你所看到的,我们已经能够将 petclinic 应用程序的启动时间减少另一个数量级,降至 75 毫秒!

信息

由于Spring 6.1和SpringBoot 3.2完全支持CRaC,因此我们不需要对代码进行修改。这里的完全支持意味着只要你使用 Spring 资源,框架就会负责在检查点之前关闭资源并在恢复后恢复它们。

如果你使用其他资源,则需要在相关类中实现 CRaC Resource 接口,并在“beforeCheckpoint()”方法中关闭其他资源(例如打开的文件或套接字连接),并在“beforeCheckpoint()”方法中重新打开其他资源。afterRestore()' 方法。

判决

正如我们所看到的,使用 CRaC 可以显着减少 SpringBoot 3.2 应用程序的启动时间。如果你只是想在不接触代码的情况下尝试一下,只需使用 Spring 6.1 / SpringBoot 3.2 中的自动检查点功能即可将启动时间减少一个数量级。

为了尽可能缩短启动时间,你可以手动创建检查点,这可以将启动时间缩短两个数量级。

CRaC 的优点在于它仍然在普通 JVM 上运行,并且在检查点/恢复后代码甚至可以进一步优化。

为了获得这些结果,我需要向 petclinic 项目添加几行代码,如果你想重现这些数字,请随时在我的 GitHub 存储库中克隆 petclinic 项目的副本。

推荐一个开源免费的 Spring Boot 实战项目:

GitHub - javastacks/spring-boot-best-practice: Spring Boot 最佳实践,包括自动配置、核心原理、源码分析、国际化支持、调试、日志集成、热部署等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/254789.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL锁机制

MySQL的锁机制用于管理事务对共享资源的并发访问&#xff0c;实现事务的隔离级别。 MySQL的锁比较多&#xff0c;下面我们按照四个维度来介绍相关的锁。 图 MySQL 锁的分类 1 加锁机制 悲观锁 操作数据时&#xff0c;认为其他线程也会对该数据进行更改。于是在获取数据时会先…

Gem5 checkkpoint使用: checkpoint恢复并运行parsec benchmark,运行和checkpoint时不同的新script

简介 Gem5 checkkpoint使用&#xff1a; 如何保存checkpoint&#xff0c;从checkpoint恢复&#xff0c;使用哪一层级的文件夹作为输入&#xff0c;-r 1制定检查点 顺序&#xff0c;并运行parsec benchmark。尤其提供运行和checkpoint时不同的新script的方法。不然每一次restor…

FinalShell的安装与使用

FinalShell是一款集成了SSH远程登录、SFTP文件传输、MySQL数据库管理、VPS服务器监控等多种功能的全能型服务器管理工具。 以下是在Linux上安装和使用FinalShell的基本步骤 1、下载FinalShell 访问FinalShell的官方网站下载对应的系统的版本。 FinalShell SSH工具,服务器管…

flask 接口处理带有图片和json数据的请求 发送图片到前端的实现

1.flask的request 从flask的源码可以看到flask的可用属性很多&#xff0c;包括data,form,files&#xff0c;header,host等&#xff0c;在我们接收文件传参时需要用到的属性就是form和files。不过具体的使用方式有两种&#xff0c;即&#xff1a;postman发送的和requests模拟发…

ES查询流程

在ES中查询分为两类&#xff1a;1.基于文档ID查询&#xff0c;2.按照非文档ID查询。 基于文档id查询 1.基于文档ID查询 当执行如下查询时&#xff1a; GET /megacorp/employee/1ES在执行上述查询的具体过程如下&#xff1a; 1、客户端向 Node 1 发送获取请求&#xff0c;此…

RocketMQ 顺序消息收发实践

目录 概述局部有序创建 Topic配置代码测试 结束 概述 顺序消息 全局有序&#xff1a;适用于性能不是特别高的场景&#xff0c;但是又要求消息又严格一致的概念。局部有序&#xff1a;适用于性能要求高的场景&#xff0c;想办法通过在设计层面处理有序的消息尽量发送至同一个 T…

Python自动化操作:简单、有趣、高效!解放你的工作流程!

今天跟大家分享一套自动化操作流程解决方案&#xff0c;基于Python语言&#xff0c;涉及pyautogui、pyperclip、pythoncom、win32com依赖包。安装命令为&#xff1a; pip install pyautoguipip install pyperclippip install pythoncompip install win32compyautogui 是一个自…

二级教师属于什么职称

教师的职称评定对于他们的职业发展具有重要意义。教育体系中&#xff0c;教师的职称分为多个等级&#xff0c;其中二级教师是其中的一个重要级别。那么&#xff0c;二级教师属于什么职称呢&#xff1f; 职称的定义。职称是指根据工作性质、职责、难度、能力等因素&#xff0c;对…

I Doc View 多个高危漏洞复现

I Doc View在线文档预览是一款在线文档预览系统。近期出现了多个高危漏洞&#xff0c;因此集中复现一下&#xff0c;有兴趣的童鞋可以收藏一下。#头条首发挑战赛# 1.Upload接口任意文件读取漏洞 1.1 漏洞级别 高危 1.2 漏洞描述 I Doc View存在代码执行漏洞&#xff0c;使…

研究前沿| scNanoCOOL-seq:单分子测序平台的单细胞多组学测序技术

scNanoCOOL-seq 2023年9月12日&#xff0c;汤富酬课题组在Cell Research上发表了题为“scNanoCOOL-seq: a long-read single-cell sequencing method for multi-omics profiling within individual cells”的论文&#xff0c;首次报道了scNanoCOOL-seq单细胞多组学测序技术。该…

深度学习中常见的激活函数

前文介绍 我们在前面了解到了线性回归模型&#xff0c;其实我们可以把线性回归看成一个单个的神经元&#xff0c;它实际上就完成了两个步骤 1.对输入的特征的加权求和 2.将结果通过传递函数&#xff08;或者激活函数&#xff09;输出 这里我们提到了传递函数&#xff08;或者…

如何本地搭建Zblog网站并通过内网穿透将个人博客发布到公网

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站…

简单搭建一个Python自动化测试框架

1. 安装Python 首先需要安装Python&#xff0c;可以从官网下载对应的版本。安装完成后&#xff0c;可以在终端中输入python来检查是否安装成功。 2. 安装pip pip是Python的包管理工具&#xff0c;用于安装和管理Python模块。可以在终端中输入以下命令来安装pip&#xff1a; …

法大大邀业内大咖剖析汽车名企数智化实战路径

法大大发布中国首部《汽车行业合同数智化白皮书》&#xff0c;聚焦趋势&#xff0c;解读行业数字化转型攻坚战的破局之道&#xff1b;深入内部&#xff0c;剖析名企数字化的探索实践。 长安汽车、蔚来汽车、上汽大通、 东风汽车集团、奥托立夫、长城滨银汽金… 一众名企高层…

LiteClient工具箱:降低成本,减少监管风险

​​发表时间&#xff1a;2023年9月14日 BSV区块链协会的工程团队一直在为即将推出的LiteClient而努力工作&#xff0c;这是一套模块化的组件&#xff0c;可使简易支付验证&#xff08;SPV&#xff09;变得更加便利。 借助LiteClient工具箱&#xff0c;交易所可以通过区块头中…

数字化医疗新篇章:构建智能医保支付购药系统

在迎接数字化医疗时代的挑战和机遇中&#xff0c;智能医保支付购药系统的建设显得尤为重要。本文将深入介绍如何通过先进的技术实现&#xff0c;构建一套智能、高效的医保支付购药系统&#xff0c;为全面建设健康中国贡献力量。 1. 引言 随着医疗科技的飞速发展&#xff0c;…

node加密集合(前端加密、后台解密)

文章目录 一、crypto 加解密生成私密钥公钥加密&#xff08;也可私钥加密&#xff09;私钥解密&#xff08;也可公钥解密&#xff09; 二、node-rsa加解密生成公私秘钥使用公钥加密&#xff08;也可私钥加密&#xff09;使用私钥解密&#xff08;也可公钥解密&#xff09; 三、…

KSP音频抓包

1. 按照网上其他教程&#xff0c;安装KSP抓音频 Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;38&#xff09;-- KSP in MDE - 大大通(简体站) Biu~笔记&#xff1a;高通蓝牙ADK&#xff08;22&#xff09;--DSP音频链路监听 - 大大通(简体站) <<Biu~笔记&#xff1a;高…

使用java调用python批处理将pdf转为图片

你可以使用Java中的ProcessBuilder来调用Python脚本&#xff0c;并将PDF转换为图片。以下是一个简单的Java代码示例&#xff0c;假设你的Python脚本名为pdf2img.py&#xff1a; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader…

虚拟展会展览如何搭建,虚拟展会展览有哪些优势

引言&#xff1a; 随着科技的不断进步&#xff0c;虚拟展会展览正逐渐成为企业推广和交流的新方式。那么虚拟展会展览应该如何搭建&#xff0c;虚拟展会展览又能带来哪些好处呢&#xff1f; 一.什么是虚拟展会展览 虚拟展会展览是一种通过网络平台进行的展览&#xff0c;与传…