1、GraalVM

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

2、Linux下安装社区版GraalVM

  • 查看服务器架构
arch

在这里插入图片描述

  • 后面同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/
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐