【进阶篇】一、GraalVM的安装与整合SpringBoot3
AOT编译器会为特定的平台创建可执行文件(如windows下的exe),这种文件即Native Image(本地镜像),如此,就不再具备跨平台性。总之,GraalVM在JIT模式,使用Graal编译器,性能好,但内存CPU占用不低。如果既追求低资源占用,又追求高性能,就花钱买企业版的GraalVM。最后,单论性能,社区版的GraalVM本地镜像模式性能是不如Hotspot JVM的JIT模式的。最
文章目录
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模式的本地镜像
# 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/
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)