- Important: Because of #1057 this tutorial is only runable on Linux machines. (native image agent is only available for Linux)
- Install GraalVM from here https://www.graalvm.org/ (Used version 20.0.0)
- (For Mac OSX versions > Catalina: Remove quarantine from the bits, info)
$ sudo xattr -r -d com.apple.quarantine path/to/graalvm/folder/
- (For Mac OSX versions > Catalina: Remove quarantine from the bits, info)
- Configure your env
- Prepend the GraalVM bin directory to the PATH environment variable:
$ export PATH=<path to GraalVM>/Contents/Home/bin:$PATH
.
To verify whether you are using GraalVM, run:$ which java
- Set the JAVA_HOME environment variable to resolve to the GraalVM installation directory:
$ export JAVA_HOME=<path to GraalVM>/Contents/Home
- (Specify GraalVM as the JRE or JDK installation in your Java IDE)
- Prepend the GraalVM bin directory to the PATH environment variable:
- GraalVM 20.0.0 was the latest version available to download. Newer releases should have fix for Bug oracle/graal#2198
- SpringBoot 2.3.x was needed for GraalVM native-image support
The application is very simple (just giving out "Hello World" at localhost:8080
but nevertheless the performance difference is significant:
Spring Boot JVM | Spring Boot Native |
---|---|
Startup: Started GraalDemoApplication in 1.305 seconds (JVM running for 1.644) | Startup: Started GraalDemoApplication in 0.066 seconds (JVM running for 0.068) |
RAM Usage: ca 502.9 MB | RAM Usage: ca 37 MB |
Size: 16 MB | Size: 89 MB |
The following steps are needed to compile the spring boot application to native code with GraalVm
mvn -DskipTests clean package
export MI=src/main/resources/META-INF
mkdir -p $MI
java -agentlib:native-image-agent=config-output-dir=${MI}/native-image -jar target/<YOUR_APP_ARTIFACT>.jar
## Due to https://github.com/oracle/graal/issues/2198 you have to add a class to reflect-config.json. Maybe its fixed in GraalVM version > 20.0.0
{
"name":"org.apache.catalina.authenticator.jaspic.AuthConfigFactoryImpl",
"allDeclaredConstructors":true,
"allDeclaredMethods":true
},
## Check if the application is working correctly: http://localhost:8080
## then hit CTRL + C to stop the running application.
tree $MI
mvn -Pgraal clean package
After successfully compiling the application you can start the application with
./target/de.wandi34.graaldemo.graaldemoapplication
Application was built with following documentations: