【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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S