当前位置: 首页 > article >正文

SpringBoot3—场景整合:AOT

一、AOT与JIT

AOTAhead-of-Time提前编译):程序执行前,全部被编译成机器码

JITJust in Time即时编译): 程序边编译,边运行;

编译:源代码(.c、.cpp、.go、.java。。。) ===编译===  机器码

语言

  1. 编译型语言:编译器
  2. 解释型语言:解释器

(1)Complier 与 Interpreter

  1. Java:半编译半解释
  2. 图示
  3. 对比编译器解释器

(2)AOT 与 JIT 对比

  1. AOT JIT 对比:
  2. 在 OpenJDK 的官方 Wiki 上,介绍了HotSpot 虚拟机一个相对比较全面的、即时编译器(JIT)中采用的优化技术列表
  3. 可使用:-XX:+PrintCompilation 打印JIT编译信息

(3)JVM架构

  1. .java === .class === 机器码
  2. JVM: 既有解释器,又有编辑器(JIT:即时编译);

(4)Java的执行过程

1.4.1流程概要

1.4.2详细流程

热点代码:调用次数非常多的代码

(5)JVM编译器

  1. JVM中集成了两种编译器,Client CompilerServer Compiler
    1. Client Compiler注重启动速度局部的优化
    2. Server Compiler更加关注全局优化,性能更好,但由于会进行更多的全局分析,所以启动速度会慢
  2. Client Compiler:
    1. HotSpot VM带有一个Client Compiler C1编译器
    2. 这种编译器启动速度快,但是性能比较Server Compiler来说会差一些
    3. 编译后的机器码执行效率没有C2的高
  3. Server Compiler:
    1. Hotspot虚拟机中使用的Server Compiler有两种C2Graal
    2. 在Hotspot VM中,默认的Server Compiler是C2编译器

(6)分层编译

  1. Java 7 引入分层编译概念,结合 C1 和 C2 优势,平衡启动速度峰值性能
  2. 分层编译将 JVM 执行状态分五层
    1. 解释执行
    2. 执行无 profiling(收集程序执行状态数据)的 C1 代码
    3. 执行仅统计方法调用次数和循环回边执行次数 profiling 的 C1 代码
    4. 执行统计所有 profiling 数据的 C1 代码
    5. 执行 C2 代码
  3. profiling 是收集反映程序执行状态的数据,基本统计数据为方法调用次数和循环回边执行次数
  4. 解释
  5. 总结

云原生:Cloud Native; Java小改版; 

  1. Java 应用现状及问题
    1. 目前 Java 应用若以 jar 包形式运行,采用解释执行,仅热点代码编译为机器码,导致初始启动速度慢,初始处理请求数量少
    2. 在大型云平台中,要求应用秒级启动且效率高,Java 应用现有运行方式难以满足这一要求
  2. 期望效果
    1. 希望 Java 应用能提前编译成机器码,实现急速启动,启动后即可高速运行,达到最高性能
    2. 编译成机器码的好处:避免在另外的服务器安装 Java 环境;编译后的机器码可在 Windows X64 等平台直接运行
  3. 原生镜像解决方案native - image(原生镜像)可将应用打包成适配本机平台的可执行文件(即机器码、本地镜像)

二、GraalVM

  1. 官网地址GraalVM
  2. GraalVM 是高性能 JDK,能加速 Java 及其他 JVM 语言编写的应用,还提供多种流行语言运行时
  3. 运行 Java 应用有两种方式:在 HotSpot JVM 上用 Graal 即时编译器;作为预先编译的本机可执行文件(本地镜像)运行
  4. GraalVM 具备多语言能力,可在单个应用中混合多种编程语言,且消除外部语言调用成本

(1)架构

(2)安装

2.2.1VisualStudio

  1. 官网地址:免费的开发人员软件和服务 - Visual Studio
  2. 别选中文

2.2.2GraalVM

(1)安装

jdk17的GraalVM的github下载地址:Release GraalVM for JDK 17 Community 17.0.9 · graalvm/graalvm-ce-builds · GitHub

(2)配置
  1. 修改 JAVA_HOME 与 Path,指向新bin路径
  2. 验证JDK环境为GraalVM提供的即可:
(3)依赖

安装 native-image 依赖

gu install native-image
(4)验证
native-image

(3)测试

2.3.1创建项目

创建普通java项目。编写HelloWorld类;

  1. 使用mvn clean package进行打包
  2. 确认jar包是否可以执行java -jar xxx.jar
  3. 可能需要给 MANIFEST.MF添加 Main-Class: 你的主类(用360压缩打开这个jar包注意:冒号后面有一个空格

2.3.2编译镜像

  1. 编译为原生镜像native-image):使用native-tools终端
  2. 编译命令
    #从入口开始,编译整个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

  3. 演示(一定要在x64 Native Tools Command Prompt for VS 2022):
  4. 演示二(一定要在x64 Native Tools Command Prompt for VS 2022):

2.3.3Linux平台测试

  1. 安装gcc等环境
    yum install lrzsz
    sudo yum install gcc glibc-devel zlib-devel
  2. 下载安装配置Linux下的GraalVM、native-image
    1. 下载:https://www.graalvm.org/downloads/
    2. 安装:GraalVM、native-image
    3. 命令解释
    4. 配置: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
  3. 安装native-image
    gu install native-image
  4. 使用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

  1. 第一步(只要勾选native!!!):
  2. 第二、三步(先点击clean、再点击compile
  3. 第四步:运行aot提前处理命令:mvn springboot:process-aot
  4. 第五步:运行native打包:mvn -Pnative native:build
  5. 注意SDK的选择:
  6. 双击即可运行
  7. 访问端口在这里

(3)常见错误

  1. 可能提示如下各种错误,无法构建原生镜像,需要配置环境变量;
    1. ​​​​​​​出现cl.exe找不到错误
    2. 出现乱码
    3. 提示no include path set
    4. 提示fatal error LNK1104: cannot open file 'LIBCMT.lib'
    5. 提示 LINK : fatal error LNK1104: cannot open file 'kernel32.lib'
    6. 提示各种其他找不到
  2. 需要修改三个环境变量:Path、INCLUDE、lib
    1. ​​​​​​​​​​​​​​Path(系统变量):添加如下值:C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\bin\Hostx64\x64(根据安装目录来)
    2. 新建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

    3. 新建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&#xff1a;Ahead-of-Time&#xff08;提前编译&#xff09;&#xff1a;程序执行前&#xff0c;全部被编译成机器码 JIT&#xff1a;Just in Time&#xff08;即时编译&#xff09;: 程序边编译&#xff0c;边运行&#xff1b; 编译&#xff1a;源代码&am…...

蓝桥与力扣刷题(蓝桥 数字三角形)

题目&#xff1a; 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和&#xff08;路径上的每一步只可沿左斜线向下或右斜线向下走&#xff09;。 输入描述…...

蓝桥试题:传球游戏(二维dp)

一、题目描述 上体育课的时候&#xff0c;小蛮的老师经常带着同学们一起做游戏。这次&#xff0c;老师带着同学们一起做传球游戏。 游戏规则是这样的&#xff1a;n 个同学站成一个圆圈&#xff0c;其中的一个同学手里拿着一个球&#xff0c;当老师吹哨子时开始传球&#xff0…...

游戏引擎学习第138天

仓库:https://gitee.com/mrxiao_com/2d_game_3 资产&#xff1a;game_hero_test_assets_003.zip 发布 我们的目标是展示游戏运行时的完整过程&#xff0c;从像素渲染到不使用GPU的方式&#xff0c;我们自己编写了渲染器并完成了所有的工作。今天我们开始了一些新的内容&#…...

Lab 3 Page Table

题目链接 我的问题&#xff1a; 1 每个进程的kernel stack是干啥的来着&#xff1f;在何时初始化的&#xff1f; 题目2&#xff1a;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 后面不执行了 第二个参数瞎写也可以&#xff0c;但是要填 这里是说不想被替换&#xff0c;就在子进程里面执行这个。 守护进程概念 后台进程 守护进程是后台进程 一个fork了一个进程&#xff…...

洛谷P1091

题目如下 思路 谢谢观看...

行为模式---迭代器模式

概念 迭代器模式是设计模式的行为模式&#xff0c;它的主要设计思想是提供一个可以操作聚合对象&#xff08;容器或者复杂数据类型&#xff09;表示&#xff08;迭代器类&#xff09;。通过迭代器类去访问操作聚合对象可以隐藏内部表示&#xff0c;也可以使客户端可以统一处理…...

阿里云 DataWorks面试题集锦及参考答案

目录 简述阿里云 DataWorks 的核心功能模块及其在企业数据治理中的作用 简述 DataWorks 的核心功能模块及其应用场景 解释 DataWorks 中工作空间、项目、业务流程的三层逻辑关系 解释 DataWorks 中的 “节点”、“工作流” 和 “依赖关系” 设计 解释 DataWorks 中 “周期任…...

【五.LangChain技术与应用】【29.LangChain Agent小案例1:智能代理的实战应用】

“为什么我的Agent总是处理不好实时数据?”“如何让AI自己调用API查股票?” 这些困扰开发者的问题,今天咱们用一个真实案例来彻底解决。不聊虚的,直接上手教你怎么用LangChain Agent造一个会自己查股价、算指标、生成报告的股票分析助手。全程高能,代码可直接复制粘贴到项…...

TWind 的黑马点评随笔

TWind 的黑马点评随笔 ​ 目前是把黑马点评的技术部分完全做完了&#xff0c;不能说吃得饱饱&#xff0c;也算个半饱吧。 ​ 黑马点评严格来说不算项目&#xff0c;因为它给的前端过于垃圾&#xff0c;内容又重在Redis&#xff0c;所以称之为Redis练习貌似跟贴切。 ​ 尽管如…...

windows部署spleeter 版本2.4.0:分离音频的人声和背景音乐

windows部署spleeter 版本2.4.0&#xff1a;分离音频的人声和背景音乐 一、Spleeter 是什么&#xff1f; Spleeter 是由法国音乐流媒体公司 Deezer 开发并开源的一款基于深度学习的音频分离工具。它能够将音乐中的不同音轨&#xff08;如人声、鼓、贝斯、钢琴等&#xff09;分…...

dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体

故事背景 stable-diffusion 集成进 dify 后&#xff0c;我们搭建一个小智能体&#xff0c;验证下文生图功能 业务流程 #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语言基础之【指针】&#xff08;下&#xff09; 指针和字符串字符指针字符指针做函数参数const修饰的指针变量指针数组做为main函数的形参项目开发常用字符串应用模型while和do-while模型两头堵模型字符串反转模型 字符串处理函数strchr()strrchr()strstr()strtok()strcpy()st…...

Redis--Hash类型

目录 一、引言 二、介绍 三、操作 1.HSET,HGET,HEXISTS,HDEL 2.HKEYS&#xff0c;HVALS 3.HGETALL&#xff0c;HMGET&#xff0c;HSAN 4.HLEN,HSETNX,HINCRBY,HINCRBYFLOAT 四、编码方式 1.ziplist&#xff08;压缩列表&#xff09; 2.hashtable&#xff08;哈希表&am…...

迷你世界脚本道具接口:Item

道具接口&#xff1a;Item 彼得兔 更新时间: 2023-04-26 10:26:18 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getItemName(...) 获取道具名称 2 getItemId(...) 获取actor对应的道具ID&#xff0c;如球类等 3 getDropItemNum(...) …...

C++中的.h文件一般是干什么的?

在C中&#xff0c;.h 文件通常是 头文件&#xff08;Header File&#xff09;&#xff0c;它们的主要作用是声明类、函数、常量、宏以及其他在多个源文件&#xff08;.cpp文件&#xff09;之间共享的元素。头文件提供了一个接口&#xff0c;使得不同的源文件能够访问这些共享的…...

大型语言模型训练的三个阶段:Pre-Train、Instruction Fine-tuning、RLHF (PPO / DPO / GRPO)

前言 如果你对这篇文章可感兴趣&#xff0c;可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」&#xff0c;查看完整博客分类与对应链接。 当前的大型语言模型训练大致可以分为如下三个阶段&#xff1a; Pre-train&#xff1a;根据大量可获得的文本资料&#…...

共享模型之管程(悲观锁)

共享模型之管程&#xff08;悲观锁&#xff09; 文章目录 共享模型之管程&#xff08;悲观锁&#xff09;一、常见线程安全的类二、对象头三、Monitor&#xff08;监视器 / 管程&#xff09;四、偏向锁偏向锁的实现原理撤销偏向锁 五、轻量级锁轻量级锁的释放 六、重量级锁七、…...

零基础C语言学习日志22(自定义类型:联合和枚举)

目录 联合体 联合体类型的声明 联合体的特点 相同成员联合体和结构体的对比 联合体大小的计算 例子 枚举类型 枚举类型的声明 枚举类型的优点 枚举类型的使用 联合体 联合体类型的声明 像结构体一样&#xff0c;联合体也是由一个或者多个成员构成&#xff0c;这些成…...

ROS2 Rviz 实战:给 panda 机械臂场景塞个圆柱体

视频讲解 ROS2 Rviz 实战&#xff1a;给 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&#xff0c;如下 #…...

DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发

不知道你们发现没有&#xff0c;就是鸿蒙开发官网&#xff0c;文档也太多太多了&#xff0c;对于新手来说确实头疼&#xff0c;开发者大多是极客&#xff0c;程序的目的是让世界更高效&#xff01;看文档&#xff0c;挺头疼的&#xff0c;毕竟都是理科生。 遇到问题不要慌&…...

从零开始在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 &#xff0c; 检查它是否轴对称。 思路与算法 对称&#xff1a;左右子树互为镜像 这很显然暗示了一种递归方法 确定base case&#xff08;s&#xff09; 如果 left 和 right 都是 None &#xff0c;那么它们是镜像的&#xff08;对称&…...

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 整体不错&#xff0c;免费版性能好&#xff0c;但内网&#xff08;离线状态&#xff09;初次使用需要登陆&#xff0c;无法通过。&#xff08;即内网不可用&#xff09; 二、postman 当测试项目多的时候可能会卡死&#xff0c;卡输入修改、丢失请求、登陆账号等问题…...

【STM32】STM32系列产品以及新手入门的STM32F103

&#x1f4e2; STM32F103xC/D/E 系列是一款高性能、低功耗的 32 位 MCU&#xff0c;适用于工业、汽车、消费电子等领域&#xff1b;基于 ARM Cortex-M3&#xff0c;主频最高 72MHz&#xff0c;支持 512KB Flash、64KB SRAM&#xff0c;适合复杂嵌入式应用&#xff0c;提供丰富的…...