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/bin
      
      source /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

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

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

相关文章

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势

*VulnHub-FristiLeaks:1.3暴力解法、细节解法&#xff0c;主打软硬都吃&#xff0c;隧道搭建、寻找exp、提权、只要你想没有做不到的姿势 一、信息收集 1、扫靶机ip 经典第一步&#xff0c;扫一下靶机ip arp-scan -l 扫描同网段 nmap -sP 192.168.122.0/242、指纹扫描、端口…

20242817李臻《Linux⾼级编程实践》第二周

一、AI对学习内容的总结 第2章 Linux编程环境总结 1. GCC编译器 GCC&#xff08;GNU Compiler Collection&#xff09;是GNU项目的一部分&#xff0c;支持多种编程语言&#xff0c;包括C、C、Java、Fortran、Ada等。编译过程&#xff1a;GCC将源程序转换为可执行程序的过程包…

vue3 组合式API:插槽

一、内容与出口 1、<slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。插槽内容可以是任意合法的模板内容&#xff0c;不局限于文本&#xff0c;可以是多个元素&#xff0c;甚至是组件 // 插槽内容可以是…

【音视频】ffplay播放控制

一、ffplay播放控制 1.1、ffplay打开视频 比如我当前目录下现在有一个1.mp4的视频&#xff0c;可以使用下面的命令用ffplay打开并播放它 ffplay 1.mp4输入后回车即可打开相应的视频 1.2 ffplay播放控制 使用q、ESC退出播放按f、双击切换全屏状态按m切换为静音按9减少音量&a…

K8S高可用集群-小白学习之二进制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…

K8S学习之基础十六:k8s中Deployment更新策略

滚动更新 滚动更新是一种自动化程度较高的发布方式、用户体验比较平滑、是目前成熟型技术组织采用的主流发布方式&#xff0c;一次滚动发布一般有若干发布批次组成&#xff0c;每批的数量一般都是可配置的&#xff0c;可通过发布模板定义&#xff0c;例如第一批10%&#xff0c…

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…

如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能

作者&#xff1a;来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通过使用 LLM 生成的词汇&#xff0c;为搜索应用增强自动补全功能&#xff0c;实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能&#xff0c;它通过在用户输入时实…

AI学习有感

和前辈聊天&#xff0c;谈到了现在的ai技术&#xff0c;这里对那天的谈话进行总结&#xff1a; AI是无状态的 我们在使用ai时有时候会有一个错觉&#xff0c;认为和ai聊天久了&#xff0c;ai就会像人与人之间交流一样&#xff0c;会保留一种对聊天对象的认知状态&#xff0c;这…

Java 8 Stream API 详解

目录 引言 一、Stream 简介 1.1 什么是 Stream&#xff1f; 1.2 Stream 与集合的区别 1.3 Stream 的操作分类 二、Stream 的创建 2.1 从集合创建 2.2 从数组创建 2.3 使用 Stream.of 创建 2.4 使用 Stream.generate 或 Stream.iterate 创建 三、Stream 的常…

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境&#xff08;一&#xff09; 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面&#xff0c;如果Ubuntu剩余空间低于60G&#xff0c;则空间不足&#xff0c;除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…

从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程

在数字化洪流席卷全球的宏大背景下&#xff0c;企业转型升级的紧迫性与重要性日益凸显&#xff0c;成为驱动行业进步的关键引擎。在这一波澜壮阔的转型浪潮中&#xff0c;方太集团——厨电领域的璀璨明珠&#xff0c;以其前瞻性的战略视野和不懈的创新精神&#xff0c;携手数据…

蓝桥杯4T平台(串口打印电压值)

知识点&#xff1a;串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”&#xff08;vision vocabulary&#xff09; 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…

关于后端接口的返回值问题

1、后端接口中&#xff0c;get请求能返回给前端一个整数么&#xff1f; 问题说明&#xff1a; 解释&#xff1a; 在 Spring MVC 项目中&#xff0c;GET 请求的后端接口可以返回一个整数给前端。因为我们在controller层中&#xff0c;设置了RestController注解&#xff0c;这表明…

React Native 实现滑一点点内容区块指示器也滑一点点

效果图如上&#xff0c;内容滑一点点&#xff0c;指示器也按比例话一点点&#xff0c;列表宽度跟数据有关。 实现思路如下&#xff1a; 1.监听列表滑动事件&#xff0c;获取列表横向滑动距离&#xff0c;假设为A&#xff1b; 2.获取列表的宽度&#xff0c;及列表可滑动的宽度…

Cursor + IDEA 双开极速交互

相信很多开发者朋友应该和我一样吧&#xff0c;都是Cursor和IDEA双开的开发模式:在Cursor中快速编写和生成代码&#xff0c;然后在IDEA中进行调试和优化 在这个双开模式的开发过程中&#xff0c;我就遇到一个说大不大说小不小的问题&#xff1a; 得在两个编辑器之间来回切换查…

JS一些小知识点

一、|| 运算符 plain this.ctx.body { type: type || 0, // ||在此处用法用于默认值填充&#xff0c;判断是否传参或该值是否存在&#xff0c;如果不存在就使用||后买你的值作为默认值 code: code || 0, msg: msg || SUCCESS, data: data || {}, ...others }; 二、trim() 方…

【孟德尔随机化】PhenoScanner不能用的,替代方法

https://ldlink.nih.gov/?tabldtrait 目前PhenoScanner数据库限制使用&#xff0c;可选择LDlink数据库替代。 可以在网页下载变异数据 还有就是library(gwasrapidd)包提取 # remotes::install_github("ramiromagno/gwasrapidd") library(gwasrapidd)# 官方文档写单…