spring boot graalvm native 试用
核心是体验下新版本支持情况同时体验下企业特性(g1 gc)
参考示例
就是基于spring start 提供的web,添加了graalvm native 构建支持,graalvm oracle 发行版直接可以官方下载
- pom.xml 核心信息
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.dalong</groupId>
<artifactId>graalvmappdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>graalvmappdemo</name>
<description>demo app</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.graalvm.buildtools</groupId>
<artifactId>native-maven-plugin</artifactId>
<configuration>
<buildArgs>
<buildArg>--enable-monitoring=jfr,jmxserver,jvmstat</buildArg> // 开启了jfr 以及一些监控
<buildArg>--gc=G1</buildArg> // 使用g1 gc
</buildArgs>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 构建
注意需要一些依赖,比如zlib 以及libstdc++-static 同时因为使用g1 gc 对于gcc 要求有点高,推荐通过centos-release-scl 构建
yum -y install centos-release-scl
yum install -y devtoolset-7-gcc*
scl enable devtoolset-7 bash
mvn clean -Dmaven.test.skip package -Pnative native:build
启动&效果
- 启动
./graalvmappdemo -XX:StartFlightRecording="filename=spring-boot.jfr" -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote=true -Djava.rmi.server.hostname=xxxxx -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9996 -Dcom.sun.management.jmxremote.ssl=false
- jmx
- jfr
说明
默认graalvm native-image 使用的是串行gc,对于高负载场景g1 gc 会比较好,以前此功能是需要企业版的,但是最近的license 许可调整,我们可以直接使用了
参考资料
https://www.graalvm.org/latest/reference-manual/native-image/guides/optimize-native-executable-with-pgo/
https://docs.spring.io/spring-boot/docs/3.0.0/reference/htmlsingle/#native-image