SpringBoot3—场景整合:AOT
一、AOT与JIT
AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码
JIT:Just in Time(即时编译): 程序边编译,边运行;
编译:源代码(.c、.cpp、.go、.java。。。) ===编译=== 机器码
语言:
- 编译型语言:编译器
- 解释型语言:解释器

(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 Compiler C1编译器
- 这种编译器启动速度快,但是性能比较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 应用若以 jar 包形式运行,采用解释执行,仅热点代码编译为机器码,导致初始启动速度慢,初始处理请求数量少
- 期望效果
- 希望 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
- 下载:https://www.graalvm.org/downloads/
- 安装: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/binsource /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\x64(根据安装目录来)
- 新建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\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\um\x64;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64
相关文章:
SpringBoot3—场景整合:AOT
一、AOT与JIT AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码 JIT:Just in Time(即时编译): 程序边编译,边运行; 编译:源代码&am…...
蓝桥与力扣刷题(蓝桥 数字三角形)
题目: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述…...
蓝桥试题:传球游戏(二维dp)
一、题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。 游戏规则是这样的:n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球࿰…...
游戏引擎学习第138天
仓库:https://gitee.com/mrxiao_com/2d_game_3 资产:game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程,从像素渲染到不使用GPU的方式,我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…...
Lab 3 Page Table
题目链接 我的问题: 1 每个进程的kernel stack是干啥的来着?在何时初始化的? 题目2:A kernel page table per process (hard) 1 一些题目要求 Your first job is to modify the kernel so that every process uses its own c…...
嵌入式学习L5D2-exec函数族和守护进程
exec函数族1 下面那个加了p环境变量就不用那个了。 输出的是系统 exec函数族2 后面不执行了 第二个参数瞎写也可以,但是要填 这里是说不想被替换,就在子进程里面执行这个。 守护进程概念 后台进程 守护进程是后台进程 一个fork了一个进程ÿ…...
洛谷P1091
题目如下 思路 谢谢观看...
行为模式---迭代器模式
概念 迭代器模式是设计模式的行为模式,它的主要设计思想是提供一个可以操作聚合对象(容器或者复杂数据类型)表示(迭代器类)。通过迭代器类去访问操作聚合对象可以隐藏内部表示,也可以使客户端可以统一处理…...
阿里云 DataWorks面试题集锦及参考答案
目录 简述阿里云 DataWorks 的核心功能模块及其在企业数据治理中的作用 简述 DataWorks 的核心功能模块及其应用场景 解释 DataWorks 中工作空间、项目、业务流程的三层逻辑关系 解释 DataWorks 中的 “节点”、“工作流” 和 “依赖关系” 设计 解释 DataWorks 中 “周期任…...
【五.LangChain技术与应用】【29.LangChain Agent小案例1:智能代理的实战应用】
“为什么我的Agent总是处理不好实时数据?”“如何让AI自己调用API查股票?” 这些困扰开发者的问题,今天咱们用一个真实案例来彻底解决。不聊虚的,直接上手教你怎么用LangChain Agent造一个会自己查股价、算指标、生成报告的股票分析助手。全程高能,代码可直接复制粘贴到项…...
TWind 的黑马点评随笔
TWind 的黑马点评随笔 目前是把黑马点评的技术部分完全做完了,不能说吃得饱饱,也算个半饱吧。 黑马点评严格来说不算项目,因为它给的前端过于垃圾,内容又重在Redis,所以称之为Redis练习貌似跟贴切。 尽管如…...
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐
windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐 一、Spleeter 是什么? Spleeter 是由法国音乐流媒体公司 Deezer 开发并开源的一款基于深度学习的音频分离工具。它能够将音乐中的不同音轨(如人声、鼓、贝斯、钢琴等)分…...
dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体
故事背景 stable-diffusion 集成进 dify 后,我们搭建一个小智能体,验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…...
pytorch3d学习(二)——安装与纹理显示demo测试
文章目录 零、安装一、渲染0. 导入模块1. 加载网格和纹理文件零、安装 参考了这篇文章:Pytorch3D Linux环境下安装(踩坑)记录 经历了红框子里面的步骤,然后测试一下官方给的代码,尝试一些 3D 算子,例如计算两个网格之间的倒角损失: from pytorch3d.utils import ico_s…...
C语言基础之【指针】(下)
C语言基础之【指针】(下) 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…...
Redis--Hash类型
目录 一、引言 二、介绍 三、操作 1.HSET,HGET,HEXISTS,HDEL 2.HKEYS,HVALS 3.HGETALL,HMGET,HSAN 4.HLEN,HSETNX,HINCRBY,HINCRBYFLOAT 四、编码方式 1.ziplist(压缩列表) 2.hashtable(哈希表&am…...
迷你世界脚本道具接口:Item
道具接口:Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID,如球类等 3 getDropItemNum(...) …...
C++中的.h文件一般是干什么的?
在C中,.h 文件通常是 头文件(Header File),它们的主要作用是声明类、函数、常量、宏以及其他在多个源文件(.cpp文件)之间共享的元素。头文件提供了一个接口,使得不同的源文件能够访问这些共享的…...
大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)
前言 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段: Pre-train:根据大量可获得的文本资料&#…...
共享模型之管程(悲观锁)
共享模型之管程(悲观锁) 文章目录 共享模型之管程(悲观锁)一、常见线程安全的类二、对象头三、Monitor(监视器 / 管程)四、偏向锁偏向锁的实现原理撤销偏向锁 五、轻量级锁轻量级锁的释放 六、重量级锁七、…...
零基础C语言学习日志22(自定义类型:联合和枚举)
目录 联合体 联合体类型的声明 联合体的特点 相同成员联合体和结构体的对比 联合体大小的计算 例子 枚举类型 枚举类型的声明 枚举类型的优点 枚举类型的使用 联合体 联合体类型的声明 像结构体一样,联合体也是由一个或者多个成员构成,这些成…...
ROS2 Rviz 实战:给 panda 机械臂场景塞个圆柱体
视频讲解 ROS2 Rviz 实战:给 panda 机械臂场景塞个圆柱体 创建add_cylinder的package ros2 pkg create add_cylinder --build-type ament_cmake --dependencies rclcpp control_msgs moveit_ros_planning_interface 在src中添加add_cylinder.cpp,如下 #…...
DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发
不知道你们发现没有,就是鸿蒙开发官网,文档也太多太多了,对于新手来说确实头疼,开发者大多是极客,程序的目的是让世界更高效!看文档,挺头疼的,毕竟都是理科生。 遇到问题不要慌&…...
从零开始在Windows使用VMware虚拟机安装黑群晖7.2系统并实现远程访问
文章目录 前言1.软件准备2. 安装VMware17虚拟机3.安装黑群晖4. 安装群晖搜索助手5. 配置黑群晖系统6. 安装内网穿透6.1 下载cpolar套件6.2 配置群辉虚拟机6.3 配置公网地址6.4 配置固定公网地址 总结 前言 本文主要介绍如何从零开始在Windows系统电脑使用VMware17虚拟机安装黑…...
爬虫逆向:脱壳工具 frida-dexdump 的使用详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 工具简介1.1 frida-dexdump介绍1.2 frida-dexdump支持场景1.3 frida-dexdump优点1.4 frida-dexdump工具使用方法2. 环境准备3. 安装 frida-dexdump4. 使用步骤4.1 步骤一:连接 Android 设备4.1 步骤二:安装目标应用…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(9)
7.3. 查询计划相关操作符 78)Repartition Streams:该操作符消费多个输入流并产生多个输出流。期间,记录内容与格式保持不变。如果查询优化器使用一个位图过滤(bitmap filter),则输出流中的数据行数将会减少。一个输入流的每行记录被放入一个输出流。如果该操作符保留顺序…...
【LeetCode101】对称二叉树
题目描述 给你一个二叉树的根节点 root , 检查它是否轴对称。 思路与算法 对称:左右子树互为镜像 这很显然暗示了一种递归方法 确定base case(s) 如果 left 和 right 都是 None ,那么它们是镜像的(对称&…...
K8s 1.27.1 实战系列(四)验证集群及应用部署测试
一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...
api测试工具(postman、apifox、apipost)
一、apifox 整体不错,免费版性能好,但内网(离线状态)初次使用需要登陆,无法通过。(即内网不可用) 二、postman 当测试项目多的时候可能会卡死,卡输入修改、丢失请求、登陆账号等问题…...
【STM32】STM32系列产品以及新手入门的STM32F103
📢 STM32F103xC/D/E 系列是一款高性能、低功耗的 32 位 MCU,适用于工业、汽车、消费电子等领域;基于 ARM Cortex-M3,主频最高 72MHz,支持 512KB Flash、64KB SRAM,适合复杂嵌入式应用,提供丰富的…...

