【JVM】一、GraalVM的安装与整合SpringBoot3

2024-04-12 10:04

本文主要是介绍【JVM】一、GraalVM的安装与整合SpringBoot3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1、GraalVM
  • 2、Linux下安装社区版GraalVM
  • 3、GraalVM的两种运行模式
    • JIT即时编译模式(Just-In-Time)
    • AOT提前编译模式(Ahead-Of-Time)
  • 4、制作AOT模式的本地镜像
  • 5、GraalVM的缺点
  • 6、SpringBoot3 + GraalVM
  • 7、GraalVM的适用场景

1、GraalVM

  • Oracle官方的一款高性能JDK(优于OpenJDK、OracleJDK)
  • Build faster, smaller, leaner applications(构建出更快更小更精简的应用)
  • 更低的CPU、内存使用率
  • 更快的启动速度(无需预热就能获得最好的性能)

2、Linux下安装社区版GraalVM

  • 查看服务器架构
arch
  • 下载你服务器架构对应的版本:https://www.graalvm.org/downloads/

在这里插入图片描述

  • 后面同OpenJDK,添加环境变量
# 解压
tar -xvf graalvm.tar.gz
# 编辑
vi /etc/profile
# 刷新生效
source /etc/profile
  • 新增路径:

在这里插入图片描述

  • 查看版本

在这里插入图片描述

3、GraalVM的两种运行模式

JIT即时编译模式(Just-In-Time)

  • 类似Oracle JDK
  • 一次编译,到处运行
  • 用内置的Graal即时编译器优化热点代码,但生成的是比HotSpot 的JIT更高性能的机器码

在这里插入图片描述

//参数可以关闭GraalVM中的Graal编译器
-XX:-UseJVMCICompiler

用JMH测试发现,关闭Graal编译器的GraalVM,其性能和Oracle JDK差不多。GraalVM除了性能,另一种模式还体现了更低的CPU和内存占用

AOT提前编译模式(Ahead-Of-Time)

AOT编译器会为特定的平台创建可执行文件(如windows下的exe),这种文件即Native Image(本地镜像),如此,就不再具备跨平台性

在这里插入图片描述

总之,GraalVM在JIT模式,使用Graal编译器,性能好,但内存CPU占用不低。AOT模式,失去了跨平台性,但资源占用低。

4、制作AOT模式的本地镜像

安装Linux环境本地镜像制作需要的依赖库:

# yum,不适配乌班图
sudo yum install gcc glibc-devel zlib-devel

制作本地镜像:

# 注意目录下不能只是一个java源文件,要javac编译出字节码文件,否则镜像生成不成功native-image 类名

运行本地镜像可执行文件:

在这里插入图片描述
执行这个可执行文件:

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

最后,单论性能,社区版的GraalVM本地镜像模式性能是不如Hotspot JVM的JIT模式的。

在这里插入图片描述

如果只追求低资源占用,那社区版的GraalVM也好。如果既追求低资源占用,又追求高性能,就花钱买企业版的GraalVM

5、GraalVM的缺点

  • 多次编译,编译环境和运行环境的AOT依赖库要一致
  • 使用框架后,编译本地镜像的过程很慢且耗资源
  • AOT生成了可执行文件,因此AOT编译器编译时需要知道所有类,但有些类是程序运行时才创建的,比如反射和动态代理,这一点需要适配解决

Spring框架中用了大量的反射和动态代理,在SpringBoot3整合适配了GraalVM的AOT模式

6、SpringBoot3 + GraalVM

SpringBoot3 适配了GraalVM :

  • 选择boot 3的版本以及GraalVM Native Support的依赖

在这里插入图片描述

  • 开发业务代码
  • 编译
  • 生成本地镜像
# Linux下编译的话,可将整个项目目录拷贝到Linux下
mvn -Pnative clean native:compile

在这里插入图片描述

  • 得到一个可执行文件

在这里插入图片描述

  • 对比下性能(当前Linux下安装了GraalVM),JIT模式启动jar包:

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

  • 执行可执行文件(AOT模式的本地镜像),启动springboot服务,耗时仅0.088s

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

  • top 进程ID可比内存占用
  • curl同一个接口,观察CPU最高占用

最后,跑在容器里的话,Dockefile可参考:(注意基础镜像以及生成本地镜像)

在这里插入图片描述

7、GraalVM的适用场景

  • 1)追求高性能
  • 公有云部分服务按照CPU和内存使用量计费(Serverless架构),换GraalVM的低资源占用可省钱

最后,GraalVM是一款独立的JDK,很多虚拟机参数和HotSpot不同,参考:

https://www.graalvm.org/22.3/reference-manual/native-image/optimizations-and-performance/MemoryManagement/

这篇关于【JVM】一、GraalVM的安装与整合SpringBoot3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896825

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain