spring boot graalvm native 试用

发布时间 2023-06-25 23:44:19作者: 荣锋亮

核心是体验下新版本支持情况同时体验下企业特性(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