SpringBoot3—场景整合:AOT
创作时间:
作者:
@小白创作中心
SpringBoot3—场景整合:AOT
引用
CSDN
1.
https://m.blog.csdn.net/weixin_74019079/article/details/146044305
SpringBoot3引入了AOT(Ahead-of-Time)编译技术,这是一种在应用运行前就将代码编译成机器码的技术,能够显著提升应用的启动速度和运行效率。本文将详细介绍AOT与JIT的区别,深入探讨JVM的编译机制,并演示如何使用GraalVM进行AOT编译,以及如何在SpringBoot项目中整合AOT编译技术。
一、AOT与JIT
AOT(Ahead-of-Time):程序执行前,全部被编译成机器码
JIT(Just in Time):程序边编译,边运行
(1)Complier 与 Interpreter
- Java:半编译半解释
- 图示:
(2)AOT 与 JIT 对比
- AOT与JIT对比:
- 在 OpenJDK 的官方 Wiki 上,介绍了HotSpot 虚拟机一个相对比较全面的、即时编译器(JIT)中采用的优化技术列表
- 可使用:-XX:+PrintCompilation 打印JIT编译信息
(3)JVM架构
- .java === .class === 机器码
- JVM:既有解释器,又有编辑器(JIT:即时编译);
(4)Java的执行过程
1.4.1流程概要
1.4.2详细流程
热点代码:调用次数非常多的代码
(5)JVM编译器
- JVM中集成了两种编译器,Client Compiler和Server Compiler;
- Client Compiler注重启动速度和局部的优化
- Server Compiler更加关注全局优化,性能更好,但由于会进行更多的全局分析,所以启动速度会慢
- Client Compiler:
- HotSpot VM带有一个Client CompilerC1编译器
- 这种编译器启动速度快,但是性能比较Server Compiler来说会差一些
- 编译后的机器码执行效率没有C2的高
- Server Compiler:
- Hotspot虚拟机中使用的Server Compiler有两种:C2和Graal
- 在Hotspot VM中,默认的Server Compiler是C2编译器
(6)分层编译
- Java 7 引入分层编译概念,结合 C1 和 C2 优势,平衡启动速度和峰值性能
- 分层编译将 JVM 执行状态分五层:
- 解释执行
- 执行无 profiling(收集程序执行状态数据)的 C1 代码
- 执行仅统计方法调用次数和循环回边执行次数 profiling 的 C1 代码
- 执行统计所有 profiling 数据的 C1 代码
- 执行 C2 代码
- profiling 是收集反映程序执行状态的数据,基本统计数据为方法调用次数和循环回边执行次数
- 解释:
- 总结:
云原生:Cloud Native; Java小改版; - Java 应用现状及问题
- 目前 Java 应用若以 jar 包形式运行,采用解释执行,仅热点代码编译为机器码,导致初始启动速度慢,初始处理请求数量少
- 在大型云平台中,要求应用秒级启动且效率高,Java 应用现有运行方式难以满足这一要求
- 期望效果
- 希望 Java 应用能提前编译成机器码,实现急速启动,启动后即可高速运行,达到最高性能
- 编译成机器码的好处:避免在另外的服务器安装 Java 环境;编译后的机器码可在 Windows X64 等平台直接运行
- 原生镜像解决方案:native - image(原生镜像)可将应用打包成适配本机平台的可执行文件(即机器码、本地镜像)
二、GraalVM
- 官网地址:GraalVM
- GraalVM 是高性能 JDK,能加速 Java 及其他 JVM 语言编写的应用,还提供多种流行语言运行时
- 运行 Java 应用有两种方式:在 HotSpot JVM 上用 Graal 即时编译器;作为预先编译的本机可执行文件(本地镜像)运行
- GraalVM 具备多语言能力,可在单个应用中混合多种编程语言,且消除外部语言调用成本
(1)架构
(2)安装
2.2.1VisualStudio
- 官网地址:免费的开发人员软件和服务 - Visual Studio
- 别选中文
2.2.2GraalVM
(1)安装
jdk17的GraalVM的github下载地址:Release GraalVM for JDK 17 Community 17.0.9 · graalvm/graalvm-ce-builds · GitHub
(2)配置
- 修改 JAVA_HOME 与 Path,指向新bin路径
- 验证JDK环境为GraalVM提供的即可:
(3)依赖
安装 native-image 依赖:
gu install native-image
(4)验证
native-image
(3)测试
2.3.1创建项目
创建普通java项目。编写HelloWorld类;
- 使用mvn clean package进行打包
- 确认jar包是否可以执行java -jar xxx.jar
- 可能需要给 MANIFEST.MF添加 Main-Class: 你的主类(用360压缩打开这个jar包)
注意:冒号后面有一个空格
2.3.2编译镜像
- 编译为原生镜像(native-image):使用native-tools终端
- 编译命令:
#从入口开始,编译整个jar
native-image -cp boot3-15-aot-common-1.0-SNAPSHOT.jar com.atguigu.MainApplication -o Haha
#编译某个类【必须有main入口方法,否则无法编译】
native-image -cp classes com.atguigu.MainApplication -o Haha
- 演示(一定要在x64 Native Tools Command Prompt for VS 2022):
- 演示二(一定要在x64 Native Tools Command Prompt for VS 2022):
2.3.3Linux平台测试
- 安装gcc等环境
yum install lrzsz
sudo yum install gcc glibc-devel zlib-devel
下载安装配置Linux下的GraalVM、native-image
安装:GraalVM、native-image
命令解释:
配置:JAVA环境变量为GraalVM
tar -zxvf graalvm-ce-java17-linux-amd64-22.3.2.tar.gz -C /opt/java/
sudo vim /etc/profile
#修改以下内容
export JAVA_HOME=/opt/java/graalvm-ce-java17-22.3.2
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
- 安装native-image
gu install native-image
- 使用native-image编译jar为原生程序
native-image -cp xxx.jar org.example.App
在Haha所在目录下直接运行
三、SpringBoot整合
(1)依赖导入
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
(2)生成native-image
- 第一步(只要勾选native!!!):
- 第二、三步(先点击clean、再点击compile)
- 第四步:运行aot提前处理命令:mvn springboot:process-aot
- 第五步:运行native打包:mvn -Pnative native:build
- 注意SDK的选择:
- 双击即可运行
- 访问端口在这里
(3)常见错误
- 可能提示如下各种错误,无法构建原生镜像,需要配置环境变量;
- 出现cl.exe找不到错误
- 出现乱码
- 提示no include path set
- 提示fatal error LNK1104: cannot open file 'LIBCMT.lib'
- 提示 LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
- 提示各种其他找不到
- 需要修改三个环境变量:Path、INCLUDE、lib
- Path(系统变量):添加如下值:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\Hostx64\u0064(根据安装目录来)
- 新建INCLUDE环境变量:值为(根据自己电脑实际情况来)
D:\Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\shared;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\ucrt;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um;C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\winrt
- 新建lib环境变量:值为(根据自己电脑实际情况来)
D:\Visual Studio\2022\Community\VC\Tools\MSVC\14.43.34808\lib\u0064;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\u0064;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\u0064
热门推荐
看《三体》必须了解的天文知识,如果地球毁灭,人类将逃无可逃
气动系统基础应用
一文带你揭秘!东莞公布考古重大发现——南海卫城墙是什么来头?
鱼腥草5款保健食疗药膳
怀孕尿酮体偏高是否需要特殊饮食?
19自由度假肢灵巧手问世,复现人手级运动能力
鄱阳湖的“碟中谍”:揭秘独特碟形湖的形成与生态价值
股票市场观察:从技术分析角度理解股票市场波动的策略
深圳的十大高楼大厦有哪些?全面解析深圳的天际线
2025全球极光盘点!含北美极光+黄刀镇极光+冰岛极光
工作案例│协调晚间噪音问题:促进宿舍和谐共处与学习效率的双重考量
抑郁症患者遭遇工作困扰:被单位辞退的困境与反思
“三座城”构建未来之城雄安:交通大动脉藏身地下,数字化贯通城市治理
超百城开启5G-A商用 多家运营商推出套餐
2025Fall香港大学入学要求汇总!有哪些学院提高了申请要求?
不容忽视的眼底病:守护眼健康的隐秘防线
上山下山骑什么摩托车好
捕风说影96|《谍影重重3》:身份迷局下的自我追寻与道德拷问
牛顿与公斤:揭秘力的本质与质量的度量
规划G4223武汉至重庆高速公路传来3个好消息!路线总长276.5公里
何为真正的修行?《菩提偈》给你答案
前端如何实现分片上传
山东奔赴咨询:构建婚姻和谐,共筑幸福家庭
2024年注册安全工程师考试最新变动详解:考试内容与要求全面升级
凌风弟子:离火之境的物理点杀王者,一回合准备,三刀爆发,PVP与PVE的双重霸主
绩效考核管理办法制定步骤有哪些关键点
原来山水崇州有这么多的美景,带你玩遍崇州最美的10个景点
灵芝提取的小分子化合物提高铂类药物抗癌效果:抑制跨损伤DNA合成
情侣之间玩什么游戏好2025 适合情侣一起玩的游戏汇总
每周黄金调查:机构看空散户看多,下周金价怎么走?