Spring之提前编译:AOT

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

文章目录

  • 前言
  • 一、AOT概述
    • 1、JIT与AOT的区别
    • 2、Graalvm
    • 3、Native Image
  • 二、演示Native Image构建过程
    • 1、GraalVM安装
      • (1)下载GraalVM
      • (2)配置环境变量
      • (3)安装native-image插件
    • 2、安装C++的编译环境
      • (1)下载Visual Studio安装软件
      • (2)安装Visual Studio
      • (3)添加Visual Studio环境变量
      • (4)打开工具,在工具中操作
    • 3、编写代码,构建Native Image
      • (1)编写Java代码
      • (2)复制文件到目录,执行编译
      • (3)Native Image 进行构建
      • (4)查看构建的文件
      • (5)执行构建的文件
  • 总结


前言

一、AOT概述
1、JIT与AOT的区别
2、Graalvm
3、Native Image
二、演示Native Image构建过程
1、GraalVM安装
(1)下载GraalVM
(2)配置环境变量
(3)安装native-image插件
2、安装C++的编译环境
(1)下载Visual Studio安装软件
(2)安装Visual Studio
(3)添加Visual Studio环境变量
(4)打开工具,在工具中操作
3、编写代码,构建Native Image
(1)编写Java代码
(2)复制文件到目录,执行编译
(3)Native Image 进行构建
(4)查看构建的文件
(5)执行构建的文件


一、AOT概述

在这里插入图片描述

1、JIT与AOT的区别

JIT和AOT 这个名词是指两种不同的编译方式,这两种编译方式的主要区别在于是否在“运行时”进行编译

(1)JIT, Just-in-time,动态(即时)编译,边运行边编译;

在程序运行时,根据算法计算出热点代码,然后进行 JIT 实时编译,这种方式吞吐量高,有运行时性能加成,可以跑得更快,并可以做到动态生成代码等,但是相对启动速度较慢,并需要一定时间和调用频率才能触发 JIT 的分层机制。JIT 缺点就是编译需要占用运行时资源,会导致进程卡顿。

(2)AOT,Ahead Of Time,指运行前编译,预先编译。

AOT 编译能直接将源代码转化为机器码,内存占用低,启动速度快,可以无需 runtime 运行,直接将 runtime 静态链接至最终的程序中,但是无运行时性能加成,不能根据程序运行情况做进一步的优化,AOT 缺点就是在程序运行前编译会使程序安装的时间增加。

**简单来讲:**JIT即时编译指的是在程序的运行过程中,将字节码转换为可在硬件上直接运行的机器码,并部署至托管环境中的过程。而 AOT 编译指的则是,在程序运行之前,便将字节码转换为机器码的过程。

java -> .class -> (使用jaotc编译工具) -> .so(程序函数库,即编译好的可以供其他程序使用的代码和数据)

在这里插入图片描述

(3)AOT的优点

**简单来讲,**Java 虚拟机加载已经预编译成二进制库,可以直接执行。不必等待及时编译器的预热,减少 Java 应用给人带来“第一次运行慢” 的不良体验。

在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
可以在程序运行初期就达到最高性能,程序启动速度快
运行产物只有机器码,打包体积小

AOT的缺点

由于是静态提前编译,不能根据硬件情况或程序运行情况择优选择机器指令序列,理论峰值性能不如JIT
没有动态能力,同一份产物不能跨平台运行

第一种即时编译 (JIT) 是默认模式,Java Hotspot 虚拟机使用它在运行时将字节码转换为机器码。后者提前编译 (AOT)由新颖的 GraalVM 编译器支持,并允许在构建时将字节码直接静态编译为机器码。

现在正处于云原生,降本增效的时代,Java 相比于 Go、Rust 等其他编程语言非常大的弊端就是启动编译和启动进程非常慢,这对于根据实时计算资源,弹性扩缩容的云原生技术相冲突,Spring6 借助 AOT 技术在运行时内存占用低,启动速度快,逐渐的来满足 Java 在云原生时代的需求,对于大规模使用 Java 应用的商业公司可以考虑尽早调研使用 JDK17,通过云原生技术为公司实现降本增效。

2、Graalvm

Spring6 支持的 AOT 技术,这个 GraalVM 就是底层的支持,Spring 也对 GraalVM 本机映像提供了一流的支持。GraalVM 是一种高性能 JDK,旨在加速用 Java 和其他 JVM 语言编写的应用程序的执行,同时还为 JavaScript、Python 和许多其他流行语言提供运行时。 GraalVM 提供两种运行 Java 应用程序的方法:在 HotSpot JVM 上使用 Graal 即时 (JIT) 编译器或作为提前 (AOT) 编译的本机可执行文件。 GraalVM 的多语言能力使得在单个应用程序中混合多种编程语言成为可能,同时消除了外语调用成本。GraalVM 向 HotSpot Java 虚拟机添加了一个用 Java 编写的高级即时 (JIT) 优化编译器。

GraalVM 具有以下特性:

(1)一种高级优化编译器,它生成更快、更精简的代码,需要更少的计算资源

(2)AOT 本机图像编译提前将 Java 应用程序编译为本机二进制文件,立即启动,无需预热即可实现最高性能

(3)Polyglot 编程在单个应用程序中利用流行语言的最佳功能和库,无需额外开销

(4)高级工具在 Java 和多种语言中调试、监视、分析和优化资源消耗

总的来说对云原生的要求不算高短期内可以继续使用 2.7.X 的版本和 JDK8,不过 Spring 官方已经对 Spring6 进行了正式版发布。

3、Native Image

目前业界除了这种在JVM中进行AOT的方案,还有另外一种实现Java AOT的思路,那就是直接摒弃JVM,和C/C++一样通过编译器直接将代码编译成机器代码,然后运行。这无疑是一种直接颠覆Java语言设计的思路,那就是GraalVM Native Image。它通过C语言实现了一个超微缩的运行时组件 —— Substrate VM,基本实现了JVM的各种特性,但足够轻量、可以被轻松内嵌,这就让Java语言和工程摆脱JVM的限制,能够真正意义上实现和C/C++一样的AOT编译。这一方案在经过长时间的优化和积累后,已经拥有非常不错的效果,基本上成为Oracle官方首推的Java AOT解决方案。
Native Image 是一项创新技术,可将 Java 代码编译成独立的本机可执行文件或本机共享库。在构建本机可执行文件期间处理的 Java 字节码包括所有应用程序类、依赖项、第三方依赖库和任何所需的 JDK 类。生成的自包含本机可执行文件特定于不需要 JVM 的每个单独的操作系统和机器体系结构。

二、演示Native Image构建过程

1、GraalVM安装

(1)下载GraalVM

进入官网下载:https://www.graalvm.org/downloads/

在这里插入图片描述
在这里插入图片描述

(2)配置环境变量

添加GRAALVM_HOME
在这里插入图片描述
把JAVA_HOME修改为graalvm的位置
在这里插入图片描述把Path修改位graalvm的bin位置
在这里插入图片描述
使用命令查看是否安装成功
在这里插入图片描述

(3)安装native-image插件

使用命令 gu install native-image下载安装
在这里插入图片描述

2、安装C++的编译环境

(1)下载Visual Studio安装软件

https://visualstudio.microsoft.com/zh-hans/downloads/
在这里插入图片描述

(2)安装Visual Studio

在这里插入图片描述
在这里插入图片描述

(3)添加Visual Studio环境变量

配置INCLUDE、LIB和Path
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)打开工具,在工具中操作

在这里插入图片描述

3、编写代码,构建Native Image

(1)编写Java代码

public class Hello {public static void main(String[] args) {System.out.println("hello world");}
}

(2)复制文件到目录,执行编译

在这里插入图片描述

(3)Native Image 进行构建

在这里插入图片描述
在这里插入图片描述

(4)查看构建的文件

在这里插入图片描述

(5)执行构建的文件

在这里插入图片描述
可以看到这个Hello最终打包产出的二进制文件大小为11M,这是包含了SVM和JDK各种库后的大小,虽然相比C/C++的二进制文件来说体积偏大,但是对比完整JVM来说,可以说是已经是非常小了。

相比于使用JVM运行,Native Image的速度要快上不少,cpu占用也更低一些,从官方提供的各类实验数据也可以看出Native Image对于启动速度和内存占用带来的提升是非常显著的:
在这里插入图片描述
在这里插入图片描述


总结

以上就是Spring之提前编译:AOT的相关知识点,希望对你有所帮助。
积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java进阶篇】深拷贝和浅拷贝的理解(保姆级文献)

✔️深拷贝和浅拷贝的理解 在计算机内存中,每个对象都有一个地址,这个地址指向对象在内存中存储的位置。当我们使用变量引用一个对象时,实际上是将该对象的地址赋值给变量。因此,如果我们将一个对象复制到另一个变量中&#xff0c…

一台服务器​最大并发 tcp 连接数多少?65535?

首先,问题中描述的65535个连接指的是客户端连接数的限制。 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少呢? 如何标…

机械革命极光Pro重装Win10系统图解

机械革命极光Pro是性能优秀的笔记本电脑,深受广大用户的喜欢,现在用户想给笔记本电脑重新安装一下操作系统,但不知道重装系统的详细步骤。下面小编将带来机械革命极光Pro笔记本电脑重装系统Win10版本的步骤介绍,帮助更多的用户完成…

Elasticsearch:无需搜索 “Christmas” 即可找到有关圣诞节的书籍

随着假期的临近,我期待着变得舒适,拿起一本新书,享受轻松的时光。 但是使用搜索栏在线发现图书并不像看起来那么容易......大多数零售搜索引擎仅依赖于关键字搜索,当我们确切地知道我们正在寻找什么书名时,这很好&…

分布式事务是什么

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免,本文就分布式事务来简单聊一下。 数据库事务 我们先从数据库事务说起。数据库事务可能大家…

【大数据存储与处理】开卷考试总复习笔记

实验部分 一、 HBase 的基本操作 1. HBase Shell入门 # 进入HBase Shell环境 hbase shell2. HBase创建数据库表 # 创建表命令 create user, info1, info2 # 查看所有表 list # 查看表结构 describe user3. HBase数据操作 数据插入 put user, 0001, info1:name, jack put us…

傻瓜式教学Docker 使用docker compose部署 php nginx mysql

首先你可以准备这个三个服务,也可以在docker compose 文件中 直接拉去指定镜像,这里演示的是镜像服务已经在本地安装好了,提供如下: PHP # 设置基础镜像 FROM php:8.2-fpm# install dependencies RUN apt-get update && apt-get install -y \vim \libzip-dev \libpng…

智慧医疗平台开发:在线问诊系统源码搭建详解

如今,在线问诊系统的出现为患者提供了更为灵活、便捷的医疗服务。我们在开发系统之前,应该先简单了解系统的功能以及相关的技术。 一、核心功能需求 -用户注册和登录:用户可以通过注册账户,或者使用第三方登录方式进入系统。 …

高速风筒4套硬件案子谁会成为王者----【其利天下技术】

关于高速风筒的硬件电路,从MCU的角度来说,严格意义上是可以区分为四种硬件电路的,当前市场上这四种硬件电路也是并行存在的。所以有朋友电话问我,我怎么看待这四种硬件方案的优劣势和未来的?今天特意根据个人视角&…

基层医疗卫生信息可视化:Flask、MySQL、Echarts的综合利用

基层医疗卫生信息可视化:Flask、MySQL、Echarts的综合利用 正文: 社区卫生健康数据可视化是提升医疗服务水平和促进健康管理的有效手段。本文将介绍一种基于Flask、MySQL和Echarts技术的社区卫生健康数据可视化系统,数据源来自市基层医疗卫生…

Apache RocketMQ,构建云原生统一消息引擎

本文整理于 2023 年云栖大会林清山带来的主题演讲《Apache RocketMQ 云原生统一消息引擎》 演讲嘉宾: 林清山(花名:隆基),Apache RocketMQ 联合创始人,阿里云资深技术专家,阿里云消息产品线负…

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于孔雀算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.孔雀算法4.实验参数设定5.算法结果6.参考文献7.MA…

Crowd Counting近期研究(附代码资源)

1.Semi-Supervised Crowd Counting with Contextual Modeling: Facilitating Holistic Understanding of Crowd Scenes paper:https://arxiv.org/abs/2310.10352 code:https://github.com/cha15yq/MRC-Crowd 摘要: 为了减轻训练可靠的人群计数模型所需的繁重标注…

二分查找——OJ题(二)

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 文章目录 一、点名1、题目讲解2、算法原理3、代码实现 二、搜索旋转排序数组中的最⼩值1、题目讲解2、算…

rime中州韵 程序配置结构讲解 保姆级教程

在完成了 Rime 引擎/框架的安装,并安装了基础输入方案后,我们就可以在这个基础上开始 DIY 了。毕竟,Rime 最大的优势就是可定制性强。 但是,在我们 DIY 前,我们需要先做些准备工作。磨刀不误砍柴工,我们需…

Javaweb见解

1 web相关的概念 1.1 软件的基本架构 C/S(Client-Server)。比如我们手机上的app QQ软件 飞秋 特点:必须下载特定的客户端程序。服务端升级之后,客户端也需要随着升级。 B/S(Broswer-Server).比如京东网站,腾讯qq官方网站 特点&#xff1…

一文搞清楚Java BytesToAscii和AsciiToBytes

文章目录 BytesToAsciiAsciiToBytes10进制和16进制byte对比 bytes2HexString和hexStringToBytes测试 BytesToAscii Testpublic void convertBytesToAscii() {byte[] bytes new byte[] { 0x31, 0x32, 0x33, 0x34, 0x35 };String asciiString new String(bytes);System.out.pri…

你怎么看待软件测试这个工作的?转行真的甘心吗!

先说一个插曲:上个月我有同学在深圳被裁员了,和我一样都是软件测试,不过他是平安外包,所以整个组都撤了,他工资和我差不多都是14K。 现在IT互联网已经比较寒冬,特别是软件测试,裁员先裁测试&am…

KaiwuDB 时序引擎数据去重功能详解

一、背景介绍 随着物联网领域的快速发展,时序数据的产生和处理需求不断增长。时序数据是按照时间顺序收集和记录的数据,其特点在于数据具有时间戳,并且时间是数据分析和查询的一个重要维度。 在实际场景中,可能存在多条相同时间…

k8s是什么

生么是k8s: Kubernetes:8个字母省略,就是k8s 自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统、 k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。 分布式和集群化的分布式进行容器管…