Spring之提前编译:AOT

这篇具有很好参考价值的文章主要介绍了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概述

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

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(程序函数库,即编译好的可以供其他程序使用的代码和数据)

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(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/

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(2)配置环境变量

添加GRAALVM_HOME
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
把JAVA_HOME修改为graalvm的位置
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java把Path修改位graalvm的bin位置
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
使用命令查看是否安装成功
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(3)安装native-image插件

使用命令 gu install native-image下载安装
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

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

(1)下载Visual Studio安装软件

https://visualstudio.microsoft.com/zh-hans/downloads/
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(2)安装Visual Studio

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(3)添加Visual Studio环境变量

配置INCLUDE、LIB和Path
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

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

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

3、编写代码,构建Native Image

(1)编写Java代码

public class Hello {

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

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

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(3)Native Image 进行构建

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(4)查看构建的文件

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java

(5)执行构建的文件

Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
可以看到这个Hello最终打包产出的二进制文件大小为11M,这是包含了SVM和JDK各种库后的大小,虽然相比C/C++的二进制文件来说体积偏大,但是对比完整JVM来说,可以说是已经是非常小了。

相比于使用JVM运行,Native Image的速度要快上不少,cpu占用也更低一些,从官方提供的各类实验数据也可以看出Native Image对于启动速度和内存占用带来的提升是非常显著的:
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java
Spring之提前编译:AOT,Spring&SpringMVC,spring,数据库,java


总结

以上就是Spring之提前编译:AOT的相关知识点,希望对你有所帮助。
积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!文章来源地址https://www.toymoban.com/news/detail-768331.html

到了这里,关于Spring之提前编译:AOT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring+SpringMVC+Mybatis】Spring+SpringMVC+Mybatis实现前端到后台完整项目

    🌕博客x主页:己不由心王道长🌕! 🌎文章说明:Spring+SpringMVC🌎 ✅系列专栏:Spring 🌴本篇内容:使用Spring、SpringMVC对以前做过的项目进行重新整合和介绍。🌴 ☕️每日一语:宁愿因做自己而招人厌恶,也不愿为了迎合他人而伪装自己,懂你的人会留下来,不懂你的人,你

    2024年02月02日
    浏览(48)
  • Spring框架常见注解(Spring、Springboot、Springmvc)

    注解 说明 @Component、@Controller、@Service、@Repository 使用在类上用于实例化Bean @Autowired 使用在字段上用于根据类型依赖注入 @Qualifier 结合@Autowired一起使用用于根据名称进行依赖注入 @Scope 标注Bean的作用范围 @Configuration 指定当前类是一个 Spring 配置类,当创建容器时会从该类上

    2024年02月15日
    浏览(52)
  • Spring+SpringMVC+SpringBoot

    bean基础配置 bean别名配置 注意事项: 获取bean无论是通过id还是name获取。如果无法获取到,将抛出异常NoSuchBeanDefinitionException bean的作用范围配置 适合交给容器进行管理的bean 表现层对象、业务层对象、数据层对象、工具对象 不适合交给容器进行管理的bean 封装实体的域对象

    2024年02月04日
    浏览(43)
  • Spring 注解 和SpringMVC注解

    Spring和Spring MVC是两个紧密相关但又不同的框架,它们都使用一系列注解来简化开发。以下是Spring和Spring MVC中一些常用的注解: ### Spring 注解: 1. **`@Component`:**    - 用于将类标记为Spring容器中的组件,由Spring自动扫描并进行管理。    - 具体的派生注解有`@Service`、`@Reposit

    2024年01月23日
    浏览(55)
  • Spring Mvc:初识SpringMvc

    编译软件:IntelliJ IDEA 2019.2.4 x64 操作系统:win10 x64 位 家庭版 Maven版本:apache-maven-3.6.3 Mybatis版本:3.5.6 SpringMvc版本:5.3.1 ①SpringMVC是Spring的一种 子框架 ,它是Spring为【 展现层 | 表示层 | 表述层 | 控制层 】提供的 基于MVC设计理念 的优秀的Web框架,是目前最主流的MVC框架。

    2024年02月13日
    浏览(54)
  • 第4天:基础入门-30余种加密编码进制&;Web&;数据库&;系统&;代码&;参数值

    1.了解加密编码进制在安全测试中的存在 2.掌握常见的加密解密编码解码进制互转的操作 3.了解常见的加密解密编码解密进制互转的影响 旨在解决类似疑问,提供思路: 你是否碰到不知道的加密方式? 你是否碰到无法找到的解密平台? 你是否碰到不知道如何解密的字符串?

    2024年02月06日
    浏览(61)
  • Spring、SpringMVC、SpringBoot的区别

    它们之间的区别如下: Spring 是一个完整的框架,提供了大量的功能和组件,包括依赖注入、面向切面编程、事务管理、数据访问、Web 开发等。 SpringMVC 是 Spring 框架的一部分,用于开发 Web 应用程序。它提供了 MVC(Model-View-Controller)模式的实现,将应用程序分为模型、视图和

    2024年02月05日
    浏览(63)
  • Spring、SpringMVC、SpingBoot的区别

    Spring是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以狠方便的整合各种框架,提供AOP(切面)机制弥补OOP(面向对象)的代码重复问题、更方便将不同类不同方法中的共同处理抽取成切面、自动注入给方法使用,比如日志异常等 SpringMVC是spring对web框架的一个解决方

    2024年02月15日
    浏览(39)
  • SSM(spring+springmvc+mybatis)整合

    @Component:实现bean的注入( 不过获取bean需要用bean的类型来获取(即class文件) ) @controller、@Service、@Repository的作用等同于@Component注解的作用,相当于其别名,只是为了更好的区分表现层,业务层,数据层的注解 ,web开发,提供3个@Component注解衍生注解(功能一样)取代 括

    2024年01月16日
    浏览(62)
  • 【九】spring、springmvc、springboot、springcloud

            从事IT这么些年,经历了行业技术的更迭,各行各业都会有事务更新,IT行业技术更迭速度快的特点尤为突出,或许这也是从事这个行业的压力所在,但另一方面反应了这个行业人才济济。不记得什么时候听说了程序员改变世界这一口号,从而让我一直坚定的在这个行

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包