GraalVM入门 Springboot3 项目 Docker home 编辑时间 2024/08/08 ![](/api/file/getImage?fileId=66b47c5dc0a657000b020acb) <br><br> ## 前言 本文是本人首次学习GraalVM的学习笔记,如有错误请见谅,并指正,感谢。内容并非原创,基本来自csdn和bilibili教程中学习内容。 <br> GraalVM是一种全新的JDK,可以把Java程序,直接打包成二进制文件,例如在Windows系统下,打包成exe文件。并且和以往内置JVM虚拟机的打包方式不同,这次真的是不含虚拟机。直接在各个操作系统下,二进制文件,直接启动。 好处是 1: 启动速度快30倍 2: 启动后内存占用减少到原本的33% 3: 无需依赖,直接在操作系统运行 目前已知的缺点是 1: 可能存在一些兼容性问题导致意想不到的BUG 2: 社区版在巨量请求吞吐性能上,不敌传统JVM 3: 在什么系统编译出的文件,只能在什么系统运行 4: 学起来脑阔疼... <br> 结合以上优缺点,个人觉得此方案特别适合Docker,由于不需要依赖JVM,打包后的Docker体积可以出奇的小,并且启动速度也相较之前有质的飞跃。再加上服务器内存昂贵,此方案可以在小内存服务器上同时运行多个项目。损失的极限性能在未来的版本更新中会逐渐弥补(截至目前在JDK21中,GraalVM对比OpenJDK性能对比已相差不大) <br> 下图左边是GraalVM 右边是传统JVM 例如OpenJDK (图片来自Bilibi IT老齐 视频截图) (此图对比数据是早期GraalVM,近期性能已追上OpenJDK) ![](/api/file/getImage?fileId=66b47b3ec0a657000b020a7e) <br><br> ## 折腾 准备工作有点长,分别需要下载配置GraalvmJDK、Maven、Visual Studio <br> 下载社区版Graalvm 根据需求选择JDK版本和操作系统 后续开发都要依赖这个JDK,包括Maven也要依赖这个JDK https://github.com/graalvm/graalvm-ce-builds/releases <br> Window下环境变量配置简单概述 所有操作都在 环境变量下的系统变量 新建一个JAVA_HOME 位置是JDK根目录 修改Path 新增2条 分别是Maven路径/bin 和 JDK/路径bin (cmd和idea如果之前已开启,需要重启应用后生效) 在cmd或powershell下通过命令测试效果 如果全部配置正确应该效果如下 ```shell PS C:\WINDOWS\system32> java -version java version "21.0.4" 2024-07-16 LTS Java(TM) SE Runtime Environment Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS-jvmci-23.1-b41) Java HotSpot(TM) 64-Bit Server VM Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS-jvmci-23.1-b41, mixed mode, sharing) PS C:\WINDOWS\system32> native-image --version native-image 21.0.4 2024-07-16 GraalVM Runtime Environment Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS-jvmci-23.1-b41) Substrate VM Oracle GraalVM 21.0.4+8.1 (build 21.0.4+8-LTS, serial gc, compressed references) PS C:\WINDOWS\system32> mvn -v Apache Maven 3.9.0 (9b58d2bad23a66be161c4664ef21ce219c2c8584) Maven home: C:\mywork\apache-maven-3.9.0 Java version: 21.0.4, vendor: Oracle Corporation, runtime: C:\mywork\jdk\graalvm\graalvm-jdk-21.0.4+8.1 Default locale: zh_CN, platform encoding: UTF-8 OS name: "windows 11", version: "10.0", arch: "amd64", family: "windows" PS C:\WINDOWS\system32> ``` <br> 在windows下通过Visual Studio安装C++环境和编译器 下载地址 https://visualstudio.microsoft.com/zh-hans/ 安装时需要选择C++ 、操作系统比如Win11、语言选择英语,其余默认即可 参考这个视频 https://www.bilibili.com/video/BV1cV4y137RL <br> 如果未来程序是放在docker执行,那需要在linux下进行编译 大概步骤是 ```shell # 配置JDK和Maven环境变量 # 略 # 安装C语言环境依赖 sudo yum install -y gcc glibc-devel zlib-devel ``` 参考这个视频 https://www.bilibili.com/video/BV1iJ4m1H7Qv <br> IDEA 新建 Springboot3 项目, JDK选择 GraalVM 21 ![](/api/file/getImage?fileId=66b47e5fc0a657000b020ad3) <br> Springboot版本选择3.3.2 新版IDEA选择依赖可以直接选择 GraalVM Native Support 如果你是旧版IDEA,在pom.xml手动添加也可以 ![](/api/file/getImage?fileId=66b47ec8c0a657000b020ad5) <br> 先简单测试下Windows下编译 在开始菜单找到这个应用 `x64 Native Tools Command Prompt for VS 2022` ```shell # CD到项目根目录 执行mvn命令 mvn -Pnative native:compile ``` 新项目过程需要2~3分钟 完成后项目根目录会多一个target文件夹 ```shell # 启动程序 .\target\graalvm-spb-demo.exe # 效果 . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.3.2) 2024-08-09T15:12:53.400+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] c.z.g.GraalvmSpbDemoApplication : Starting AOT-processed GraalvmSpbDemoApplication using Java 21.0.4 with PID 16500 (C:\mywork\idea-2023-workspace\graalvm-spb-demo\target\graalvm-spb-demo.exe started by Administrator in C:\mywork\idea-2023-workspace\graalvm-spb-demo) 2024-08-09T15:12:53.400+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] c.z.g.GraalvmSpbDemoApplication : No active profile set, falling back to 1 default profile: "default" 2024-08-09T15:12:53.424+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port 8080 (http) 2024-08-09T15:12:53.425+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2024-08-09T15:12:53.425+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.26] 2024-08-09T15:12:53.437+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2024-08-09T15:12:53.438+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 38 ms 2024-08-09T15:12:53.456+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path '/' 2024-08-09T15:12:53.457+08:00 INFO 16500 --- [graalvm-spb-demo] [ main] c.z.g.GraalvmSpbDemoApplication : Started GraalvmSpbDemoApplication in 0.076 seconds (process running for 0.083) ``` <br><br> ## END 参考: https://blog.csdn.net/xingwanganfang/article/details/140641512 https://www.bilibili.com/video/BV1cV4y137RL https://www.bilibili.com/video/BV1iJ4m1H7Qv 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay Docker IDEA Springboot3 Win11 Docker Toolbox VirtualBox 整合入门笔记 Vue3 Vite 入门笔记 2024