面试时遇到大佬提点了下在性能不足的机器上传统优化JVM调优已经作用不大的背景下,采用graalvm进行打包成二进制文件,脱离java虚拟机,性能提升20%到100%,因此实操记录下来,方便后续使用
1、前置预装
graalvm-ce-java17-windows-amd64-22.3.3.zip
native-image-installable-svm-java17-windows-amd64-22.3.3.jar(必须和graalvm版本一致,22.3.3)
下载地址:Release GraalVM Community Edition 22.3.3 · graalvm/graalvm-ce-builds · GitHub
Visual Studio Community 2022
下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux (microsoft.com)
maven3.9.7(maven版本过低可能会不兼容提示报错,自行maven官方下载配置即可)
(1)graalvm-ce-java17-windows-amd64-22.3.3.zip解压到一个目录下
和安装java一样进行环境变量配置
cmd执行java -vesion查看是否配置好
(2)安装native-image
在下载好的native-image-installable-svm-java17-windows-amd64-22.3.3.jar目录下,cmd执行
gu install -L native-image-installable-svm-java17-windows-amd64-22.3.3.jar
(3)安装Visual Studio Community 2022
勾选使用C++的桌面开发及window 11 sdk
勾选英语(中文可能会有问题),安装位置默认即可,无需修改(怕有问题)
配置Visual Studio的环境变量
MSVC
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807
注意:在你的电脑上安装的Visual Studio目录14.40.33807不一定是这个值,可以直接打开C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\查看
进行配置:
下面都一样,需要自行查看目录
WK10_BIN
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0
WK10_INCLUDE
C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0
WK10_LIB
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.22621.0
INCLUDE
%WK10_INCLUDE%\ucrt;%WK10_INCLUDE%\um;%WK10_INCLUDE%\shared;%MSVC%\include;
LIB
%WK10_LIB%\um\x64;%WK10_LIB%\ucrt\x64;%MSVC%\lib\x64;
Path下新增
%MSVC%\bin\HostX64\x64
%WK10_BIN%\x64
cmd执行cl查看是否配置好
2、试运行创建单体demo生成exe直接执行
(1)创建一个springboot3.0项目,pom中加入如下插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${project.build.finalName}</finalName>
<archive>
<manifest>
<mainClass>${start-class}</mainClass>
</manifest>
</archive>
<!-- 表示使用assembly预制的描述符jar-with-dependencies创建包含项目依赖的程序集二进制文件。 -->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<appendAssemblyId>false</appendAssemblyId>
</configuration>
<!--配置将创建程序集绑定到了package阶段。则在执行mvn package后,会在target目录下生成类似的文件:
XXX-1.0-SNAPSHOT-jar-with-dependencies.jar,在版本和后缀之间的jar-with-dependencies为用于创建程序集的描述符的id,
即自定义的assembly描述符文件中配置的id。如果不想在文件或目录后追加此id,可以在配置中将appendAssemblyId设置为false-->
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<version>${native.maven.plugin.version}</version>
<configuration>
<skip>false</skip>
<!-- 使用参数文件进行原生映像构建 -->
<useArgFile>false</useArgFile>
<!-- 指定镜像名称 如果未提供自定义映像名称,则默认使用项目的工件 ID。-->
<imageName>${project.artifactId}</imageName>
<!-- 指定主类 -->
<mainClass>${start-class}</mainClass>
<!-- 其他参数传递给本机映像生成器 -->
<buildArgs>
--no-fallback
-H:-CheckToolchain
</buildArgs>
<!-- GraalVM 可达性元数据支持 -->
<metadataRepository>
<enabled>true</enabled>
</metadataRepository>
<!--
<agent>
<enabled>true</enabled>
</agent>
-->
<!--使用快速构建模式构建映像 -->
<!-- <quickBuild>true</quickBuild>-->
</configuration>
<extensions>true</extensions>
<executions>
<execution>
<goals>
<!-- “native:build”目标已弃用。请改用 'native:compile-no-fork'。 -->
<goal>compile-no-fork</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<properties>
<java.version>17</java.version>
<native.maven.plugin.version>0.10.1</native.maven.plugin.version>
<start-class>com.example.demo.DemoApplication</start-class>
<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
</properties>
start-class:指向启动类
(2)生成exe文件
我们在搜索栏中输入x64 native tools找到并打开
cd到项目目录下
执行命令
mvn -Pnative native:compile
经过一段时间,执行完成
此时,我们打开target目录,可以找到生成的exe文件
然后执行exe,执行成功
注:期间可能会遇到很多问题,和人生一样,跌宕起伏。自行百度解决,相信很快就能执行成功