Heute mal ein Vergleich mit einem Beispiel-Quarkus-REST Service normal vs. nativ.
Um die Größe und die Buildzeit zu vergleichen. Hier das Ergebnis vorweg:
1 2 3 |
Build Start Größe normal 4,00 s 0,625 s 4588 Byte nativ 53,47 s 0,018 s 39,126296 MB |
Also native gebaute Apps sind wesentlich länger zur Buildzeit dafür laufen sie aber auch wesentlich schneller und sind dann auch auf das jeweilige Betriebssystem beschränkt.
Um auf einen MacOs Quarkus auch nativ zu kompilieren muss die GraalVM und das Native-Image installiert sein.
Also installieren wir die GraalVM auf dem Mac mit Port:
1 |
sudo port install openjdk11-graalvm |
wie auch hier beschrieben:
# Und den gu (GraalVM updater) installieren mit
1 |
sudo gu install native-image |
Dann tragen wir noch die Java Version in der ~/.bash_profile ein, für das neue Java Home
1 |
JAVA_HOME=/Library/Java/JavaVirtualMachines/openjdk11-graalvm/Contents/Home |
# Noch die Bash neu starten und testen
java –version
#ok installiert
openjdk 11.0.14 2022-01-18
OpenJDK Runtime Environment GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05)
OpenJDK 64-Bit Server VM GraalVM CE 22.0.0.2 (build 11.0.14+9-jvmci-22.0-b05, mixed mode, sharing)
# oder alle Versionen und Pfade anzeigen und testen
/usr/libexec/java_home -V
So, die Vorarbeiten sind nun getan. Dann mal ein Vergleich mit dem REST-Server der CO2-Ampel:
Erst mal das Beispiel-Quarkus-Projekt mit git clonen:
1 |
git clone https://gitlab.com/IT-Berater/quarkus-rest-co2-beispiel.git |
Dann das Native Package bauen:
mvn clean package -Pnative
# Das dauert:
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 50724ms
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 53.475 s
Hier mal ein ausführliches Log, über 1 Minute mit Details:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
mvn clean package -Pnative [INFO] Scanning for projects... [INFO] [INFO] ----------------< de.wenzlaff.info:co2-ampel-beispiel >----------------- [INFO] Building co2-ampel-beispiel 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ co2-ampel-beispiel --- [INFO] Deleting /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ co2-ampel-beispiel --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] Copying 2 resources [INFO] [INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ co2-ampel-beispiel --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ co2-ampel-beispiel --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/src/test/resources [INFO] [INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ co2-ampel-beispiel --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 1 source file to /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/test-classes [INFO] [INFO] --- maven-surefire-plugin:2.22.0:test (default-test) @ co2-ampel-beispiel --- [INFO] [INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running de.wenzlaff.InfoResourceTest 2022-04-30 15:57:16,720 INFO [org.jbo.threads] (main) JBoss Threads version 3.4.2.Final 2022-04-30 15:57:17,711 INFO [io.quarkus] (main) Quarkus 2.8.1.Final on JVM started in 1.420s. Listening on: http://localhost:8081 2022-04-30 15:57:17,712 INFO [io.quarkus] (main) Profile test activated. 2022-04-30 15:57:17,712 INFO [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx] [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.11 s - in de.wenzlaff.InfoResourceTest 2022-04-30 15:57:18,877 INFO [io.quarkus] (main) Quarkus stopped in 0.032s [INFO] [INFO] Results: [INFO] [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ co2-ampel-beispiel --- [INFO] Building jar: /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/co2-ampel-beispiel-1.0-SNAPSHOT.jar [INFO] [INFO] --- quarkus-maven-plugin:2.8.1.Final:build (default) @ co2-ampel-beispiel --- [INFO] [io.quarkus.deployment.pkg.steps.JarResultBuildStep] Building native image source jar: /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar/co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar [INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Building native image from /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar/co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar [INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildStep] Running Quarkus native-image plugin on GraalVM 22.0.0.2 Java 11 CE (Java Version 11.0.14+9-jvmci-22.0-b05) [INFO] [io.quarkus.deployment.pkg.steps.NativeImageBuildRunner] /Library/Java/JavaVirtualMachines/openjdk11-graalvm/Contents/Home/bin/native-image -J-Djava.util.logging.manager=org.jboss.logmanager.LogManager -J-Dsun.nio.ch.maxUpdateArraySize=100 -J-Dvertx.logger-delegate-factory-class-name=io.quarkus.vertx.core.runtime.VertxLogDelegateFactory -J-Dvertx.disableDnsResolver=true -J-Dio.netty.leakDetection.level=DISABLED -J-Dio.netty.allocator.maxOrder=3 -J-Duser.language=de -J-Duser.country=DE -J-Dfile.encoding=UTF-8 -H:-ParseOnce -J--add-exports=java.security.jgss/sun.security.krb5=ALL-UNNAMED -J--add-opens=java.base/java.text=ALL-UNNAMED -H:InitialCollectionPolicy=com.oracle.svm.core.genscavenge.CollectionPolicy\$BySpaceAndTime -H:+JNI -H:+AllowFoldMethods -J-Djava.awt.headless=true -H:FallbackThreshold=0 -H:+ReportExceptionStackTraces -H:-AddAllCharsets -H:EnableURLProtocols=http -H:-UseServiceLoaderFeature -H:+StackTrace co2-ampel-beispiel-1.0-SNAPSHOT-runner -jar co2-ampel-beispiel-1.0-SNAPSHOT-runner.jar ======================================================================================================================== GraalVM Native Image: Generating 'co2-ampel-beispiel-1.0-SNAPSHOT-runner'... ======================================================================================================================== [1/7] Initializing... (8,1s @ 0,26GB) Version info: 'GraalVM 22.0.0.2 Java 11 CE' 3 user-provided feature(s) - io.quarkus.runner.AutoFeature - io.quarkus.runtime.graal.DisableLoggingAutoFeature - io.quarkus.runtime.graal.ResourcesFeature [2/7] Performing analysis... [**********] (15,7s @ 1,40GB) 9.692 (94,34%) of 10.274 classes reachable 14.500 (64,25%) of 22.568 fields reachable 48.200 (81,52%) of 59.128 methods reachable 419 classes, 18 fields, and 724 methods registered for reflection 68 classes, 89 fields, and 54 methods registered for JNI access [3/7] Building universe... (1,4s @ 1,78GB) [4/7] Parsing methods... [*] (1,9s @ 3,33GB) [5/7] Inlining methods... [*****] (4,2s @ 3,66GB) [6/7] Compiling methods... [****] (14,8s @ 3,95GB) [7/7] Creating image... (3,7s @ 1,28GB) 18,34MB (45,31%) for code area: 32.059 compilation units 18,61MB (45,97%) for image heap: 6.655 classes and 256.791 objects 3,53MB ( 8,72%) for other data 40,49MB in total ------------------------------------------------------------------------------------------------------------------------ Top 10 packages in code area: Top 10 object types in image heap: 1,65MB sun.security.ssl 6,16MB byte[] for general heap data 965,61KB java.util 2,30MB java.lang.Class 686,92KB com.sun.crypto.provider 1,97MB java.lang.String 490,01KB sun.security.x509 1,51MB byte[] for java.lang.String 422,71KB io.netty.buffer 572,72KB java.util.HashMap$Node 395,96KB java.util.concurrent 390,66KB java.lang.String[] 376,22KB java.lang 364,73KB com.oracle.svm.core.util.LazyFinalReference 367,17KB java.io 330,81KB java.util.HashMap$Node[] 358,64KB com.oracle.svm.core.reflect 311,53KB java.util.LinkedHashMap 352,91KB io.netty.handler.codec.http2 295,75KB byte[] for method metadata ... 368 additional packages ... 2360 additional object types (use GraalVM Dashboard to see all) ------------------------------------------------------------------------------------------------------------------------ 3,9s (7,3% of total time) in 28 GCs | Peak RSS: 6,47GB | CPU load: 9,41 ------------------------------------------------------------------------------------------------------------------------ Produced artifacts: /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar/co2-ampel-beispiel-1.0-SNAPSHOT-runner (executable) /Users/thomaswenzlaff/git/quarkus-rest-co2-beispiel/target/co2-ampel-beispiel-1.0-SNAPSHOT-native-image-source-jar/co2-ampel-beispiel-1.0-SNAPSHOT-runner.build_artifacts.txt ======================================================================================================================== Finished generating 'co2-ampel-beispiel-1.0-SNAPSHOT-runner' in 53,3s. [INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 56222ms [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:04 min [INFO] Finished at: 2022-04-30T15:58:16+02:00 [INFO] ------------------------------------------------------------------------ |
Das starten des nativ gebauten Programm:
./co2-ampel-beispiel-1.0-SNAPSHOT-runner
1 2 3 4 5 6 7 |
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2022-04-29 18:07:00,721 INFO [io.quarkus] (main) co2-ampel-beispiel 1.0-SNAPSHOT native (powered by Quarkus 2.8.1.Final) started in 0.018s. Listening on: http://0.0.0.0:8080 2022-04-29 18:07:00,721 INFO [io.quarkus] (main) Profile prod activated. 2022-04-29 18:07:00,721 INFO [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx] |
im Gegensatz zu dem Normalen:
mvn clean package
Total time: 4.006 s
Da ist das Jar im Target Verzeichnis
nur 4588 Byte groß (info-kleinhirn-1.0-SNAPSHOT.jar) das Native hingegen
39.126.296 MB (info-kleinhirn-1.0-SNAPSHOT-runner). Dafür startet er aber auch nativ in 18 ms:
./info-kleinhirn-1.0-SNAPSHOT-runner
1 2 3 4 5 6 7 |
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2022-04-24 19:13:32,274 INFO [io.quarkus] (main) info-kleinhirn 1.0-SNAPSHOT native (powered by Quarkus 2.8.1.Final) started in 0.018s. Listening on: http://0.0.0.0:8080 2022-04-24 19:13:32,275 INFO [io.quarkus] (main) Profile prod activated. 2022-04-24 19:13:32,275 INFO [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx] |
Ein normaler Start:
java -jar quarkus-app/quarkus-run.jar
1 2 3 4 5 6 7 |
__ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2022-04-29 18:10:20,159 INFO [io.quarkus] (main) co2-ampel-beispiel 1.0-SNAPSHOT on JVM (powered by Quarkus 2.8.1.Final) started in 0.625s. Listening on: http://0.0.0.0:8080 2022-04-29 18:10:20,175 INFO [io.quarkus] (main) Profile prod activated. 2022-04-29 18:10:20,175 INFO [io.quarkus] (main) Installed features: [cdi, resteasy, smallrye-context-propagation, vertx] |