Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20201209_IT-Tage_Lehmann_GraalVM-Native-Image.pdf

Martin Lehmann
December 06, 2020
30

 20201209_IT-Tage_Lehmann_GraalVM-Native-Image.pdf

Remote-Vortrag am 9.12.2020 auf den IT-Tagen 2020

Die GraalVM ist eine - gar nicht mal so neue - Java VM, die Schritt für Schritt immer mehr Produktionsreife und Popularität bei Entwicklern und Architekten gewinnt.

Graal macht vor allem zwei Dinge anders als die altbekannte HotspotVM: Graal ist wirklich polyglott, das Zusammenspiel verschiedener Programmiersprachen findet nicht nur auf der BytecodeEbene statt.

Darüber hinaus verspricht Graal auch viel bessere Performance: Schneller
Startup, geringer Speicherverbrauch und außerdem die Möglichkeit, Java-Code "ahead-oftime" nach Native-Code zu kompilieren.
Wir konzentrieren uns in unserem Talk auf den Performance-Aspekt, demonstrieren Vorgehen und Auswirkungen anhand von Live-Demos und gehen auch auf nötige Voraussetzungen ein, denn wie immer: Nichts kommt ohne einen Preis.

Martin Lehmann

December 06, 2020
Tweet

Transcript

  1. 07. – 10.12.2020 #ittage Performance von Native Images auf der

    GraalVM Martin Lehmann Dr. Rüdiger Grammes Schneller, besser, kleiner
  2. Copyright © Accso – Accelerated Solutions GmbH 2 v.3 v.3.18

    Performance von Native Images auf der MARTIN LEHMANN DR. RÜDIGER GRAMMES @mrtnlhmnn IT-Tage 2020, Dezember 2020 Schneller, besser, kleiner
  3. Copyright © Accso – Accelerated Solutions GmbH 3 Dr. Rüdiger

    Grammes Accso - Accelerated Solutions GmbH Softwarearchitekt Dr. Rüdiger Grammes ist seit November 2011 als Principal bei der Accso – Accelerated Solutions GmbH und dort als Softwarearchitekt in verschiedenen Projekten unterwegs. [email protected] www.xing.com/profile/Ruediger_Grammes Martin Lehmann Accso - Accelerated Solutions GmbH Cheftechnologe Martin Lehmann ist Diplom-Informatiker und als Cheftechnologe und Softwarearchitekt bei der Accso – Accelerated Solutions GmbH tätig. Seit Ende der 90er-Jahre arbeitet er als Softwareentwickler und -architekt in der Softwareentwicklung in diversen Projekten der Individualentwicklung für Kunden verschiedener Branchen. Seit den Zeiten von Java 1.0 beschäfigt er sich mit Java als Programmiersprache und als Ökosystem. [email protected] @mrtnlhmnn xing.to/mle
  4. Copyright © Accso – Accelerated Solutions GmbH 4 https://www.ittage.informatik-aktuell.de/programm/2020/performance-und-native-images-auf-der-graalvm-schneller-besser-kleiner.html Die

    GraalVM ist eine - gar nicht mal so neue - Java VM, die Schritt für Schritt immer mehr Produktionsreife und Popularität bei Entwicklern und Architekten gewinnt. Graal macht vor allem zwei Dinge anders als die altbekannte HotspotVM: Graal ist wirklich polyglott, das Zusammenspiel verschiedener Programmiersprachen findet nicht nur auf der Bytecode- Ebene statt. Darüber hinaus verspricht Graal auch viel bessere Performance: Schneller Startup, geringer Speicherverbrauch und außerdem die Möglichkeit, Java-Code "ahead-of- time" nach Native-Code zu kompilieren. Wir konzentrieren uns in unserem Talk auf den Performance-Aspekt, demonstrieren Vorgehen und Auswirkungen anhand von Live-Demos und gehen auch auf nötige Voraussetzungen ein, denn wie immer: Nichts kommt ohne einen Preis. Abstract
  5. Copyright © Accso – Accelerated Solutions GmbH 5 Vorsicht, Fallen!

    Performance: Wie schnell ist das wirklich? Einführung: Graal? Native-Image!
  6. Copyright © Accso – Accelerated Solutions GmbH 6 im Überblick

    Graal und GraalVM General Recursive Applicative and Algorithmic Language Graal = Java Bytecode Compiler GraalVM = Universal Virtual Machine für Anwendungen in JVM-basierten Sprachen wie Java, Scala, Clojure, Kotlin, in JavaScript, Python, Ruby, R, in LLVM-basierte Sprachen wie C and C++. Mit Graal im JVM-Modus Mit Native-Images Versionen Ganz frisch: Version 20.3.0 Community Edition (CE) und Enterprise Edition (EE) Für Java8 und Java11 Hier: auf Win10 mit WSL2/Ubuntu http://graalvm.org https://github.com/oracle/graal Lizenzen siehe Übersicht auf Github
  7. Copyright © Accso – Accelerated Solutions GmbH 7 Twitter nutzt

    Graal schon produktiv https://www.constellationr.com/research/how-oracle-graal-supercharged-twitter-s-microservices-platform
  8. Copyright © Accso – Accelerated Solutions GmbH 8 baut auch

    Native-Images Ahead-of-Time Compile AOT Gebaut wird ein Standalone Executable. “closed-world assumption”: Alle Klassen, alles an Bytecode muss zur Build-Zeit bekannt sein. Optimierungen nur zur Build-Zeit, nicht mehr zur Laufzeit. Cross-Compile ist möglich. Alternativ kann man auch eine Shared Library erstellen. Alle Anwendungsklassen sowie alle transitiven Abhängigkeiten, ausgehend von einer Main-Class Auch “statically linked native code” des JDK Die Substrate VM Executable benötigt zur Laufzeit keine JVM. Stattdessen ist alles Nötige in das Executable verpackt. Was wird mit verpackt?
  9. Copyright © Accso – Accelerated Solutions GmbH 9 führt auch

    Native-Images aus SubstrateVM = Runtime als Basis um solchermaßen AOT kompilierten Code ohne JVM ausführen zu können, mit: Memory Management (die üblichen Settings wie –Xms… funktionieren zur Laufzeit) Thread Scheduling Garbage Collector (Default: Serial GC) Keine Warm-up-Zeit nötig Substrate VM https://www.graalvm.org/examples/n ative-image-examples/ https://www.graalvm.org/reference- manual/native-image/ Doku
  10. Copyright © Accso – Accelerated Solutions GmbH 10 Spring Boot

    unterstützt auch schon Graal/Native https://spring.io/blog/2020/04/16/spring-tips-the-graalvm-native-image-builder-feature
  11. Copyright © Accso – Accelerated Solutions GmbH 11 Alle Beispiele

    auf Github: https://github.com/accso/graalvm-native Diese Demo (und alle folgenden) nun mit dieser Umgebung: • Windows 10 mit WSL2 (Linux/Ubuntu) • GraalVM 20.3.0 Community Edition für Java 11 • Messungen auch im Vergleich mit • GraalVM 20.3.0 Enterprise Edition für Java 11 • Hotspot AdoptOpenJDK 11.0.9+11 Unsere Beispiele sind auf Github
  12. Copyright © Accso – Accelerated Solutions GmbH 12 Kurzer Umgebungscheck

    lehmann@edwards03:~/graal/graalvm-native $ $ echo $GRAALVM_HOME /opt/graalvm-ce-java11-20.3.0 lehmann@edwards03:~/graal/graalvm-native $ $ $GRAALVM_HOME/bin/java -version openjdk version "11.0.9" 2020-10-20 OpenJDK Runtime Environment GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06) OpenJDK 64-Bit Server VM GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06, mixed mode, sharing) lehmann@edwards03:~/graal/graalvm-native $ $ $GRAALVM_HOME/bin/gu list … native-image 20.3.0 Native Image lehmann@edwards03:~/graal/graalvm-native $ $ $GRAALVM_HOME/bin/native-image --help $ $GRAALVM_HOME/bin/native-image --expert-options-all
  13. Copyright © Accso – Accelerated Solutions GmbH 13 Beispiel „HelloWorld“

    und Build-Skript public class HelloWorld { HelloWorld.java public static void main(String[] args) { System.out.println("Hello, World!"); } } SRC=./src build.sh TARGET=./target mkdir -p ${TARGET} ${GRAALVM_HOME}/bin/javac -d ${TARGET} ${SRC}/HelloWorld.java … ${GRAALVM_HOME}/bin/native-image --no-fallback \ -H:+PrintAnalysisCallTree \ -H:+ReportExceptionStackTraces \ HelloWorld helloworld native-image baut aus .class/.jar-Datei das Native-Executable.
  14. Copyright © Accso – Accelerated Solutions GmbH 15 Beispiel „HelloWorld“:

    Build-Output lehmann@edwards03:~/graal/graalvm-native/helloworld $ build-log $ bash ./build.sh (gekürzt) [helloworld:831] classlist: 3,383.00 ms, 0.96 GB [helloworld:831] (cap): 1,717.37 ms, 0.96 GB [helloworld:831] setup: 4,121.92 ms, 0.96 GB [helloworld:831] (clinit): 293.83 ms, 1.71 GB [helloworld:831] (typeflow): 11,061.04 ms, 1.71 GB [helloworld:831] (objects): 8,066.54 ms, 1.71 GB [helloworld:831] (features): 823.61 ms, 1.71 GB [helloworld:831] analysis: 20,491.30 ms, 1.71 GB … [helloworld:831] universe: 614.96 ms, 1.71 GB [helloworld:831] (parse): 4,562.22 ms, 1.71 GB [helloworld:831] (inline): 2,517.41 ms, 1.71 GB [helloworld:831] (compile): 24,556.01 ms, 2.33 GB [helloworld:831] compile: 32,519.66 ms, 2.33 GB [helloworld:831] image: 1,950.96 ms, 2.33 GB [helloworld:831] write: 694.26 ms, 2.33 GB [helloworld:831] [total]: 65,911.08 ms, 2.33 GB Beim Bauen können Reports erzeugt werden für • Call Tree • Used Classes • Uses Packages • Used Methods
  15. Copyright © Accso – Accelerated Solutions GmbH 16 Executable: Start!

    Größe? File-Type? lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ ./target/helloworld Hello, World! lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ ls -laF target/* -rw-r--r-- 1 lehmann lehmann 427 Dec 2 16:48 target/HelloWorld.class -rwxr-xr-x 1 lehmann lehmann 9.4M Dec 2 16:50 target/helloworld* lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ file ./target/helloworld helloworld: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0ce302e885e8b38a2157442c229b03a577596d06, for GNU/Linux 3.2.0, not stripped
  16. Copyright © Accso – Accelerated Solutions GmbH 17 Executable: Welche

    Java-Version? lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ strings ./target/helloworld | grep com.oracle.svm.core.VM com.oracle.svm.core.VM com.oracle.svm.core.VM.Target.LibC=com.oracle.svm.core.posix.linux.libc.GLibC com.oracle.svm.core.VM.Target.StaticLibraries=liblibchelper.a|libnet.a|libffi.a |libnio.a|libjava.a|libfdlibm.a|libzip.a|libjvm.a com.oracle.svm.core.VM.Target.CCompiler=gcc|linux|x86_64|9.3.0 com.oracle.svm.core.VM.Target.Libraries=pthread|dl|z|rt com.oracle.svm.core.VM=GraalVM 20.3.0 Java 11 com.oracle.svm.core.VM.Target.Platform=org.graalvm.nativeimage.Platform$LINUX_A MD64
  17. Copyright © Accso – Accelerated Solutions GmbH 18 Vorsicht, Fallen!

    Performance: Wie schnell ist das wirklich? Einführung: Graal? Native-Image!
  18. Copyright © Accso – Accelerated Solutions GmbH 19 Was bedeutet

    „Performance“? Der übliche Disclaimer: „Wer viel misst, misst viel Mist.“ Startup-Zeit Memory Laufzeit
  19. Copyright © Accso – Accelerated Solutions GmbH 20 Startup-Zeiten von

    „helloworld“ time java -cp target HelloWorld run.sh time ./target/helloworld (run-loop*.sh nicht gezeigt) lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ time ./run-loop_graal-jvm.sh 100 ... real 0m8.425s user 0m8.126s sys 0m1.774s lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ time ./run-loop_graal-native.sh 100 ... real 0m0.122s user 0m0.111s sys 0m0.018s
  20. Copyright © Accso – Accelerated Solutions GmbH 21 Startup des

    Native-Executables ist signifikant schneller. Der übliche Disclaimer: „Wer viel misst, misst viel Mist.“ Startup-Zeit Native-Image ist signifikant schneller im Startup. In HelloWorld-Beispiel mit Faktor >> 70! Da alles in das Native- Image verpackt ist, muss insbesondere keine JVM hochfahren. Memory Laufzeit
  21. Copyright © Accso – Accelerated Solutions GmbH 22 Startup des

    Native-Executables ist signifikant schneller. Der übliche Disclaimer: „Wer viel misst, misst viel Mist.“ Startup-Zeit Native-Image ist signifikant schneller im Startup. In HelloWorld-Beispiel mit Faktor >> 70! Da alles in das Native- Image verpackt ist, muss insbesondere keine JVM hochfahren. Memory Laufzeit Vorsicht Falle unter WSL2 Zugriffe auf /mnt/c sind unter WSL2 um Faktoren langsamer als auf /. Wenn man das Beispiel unter /mnt/c ausprobiert, dann ist Native zum Teil sogar langsamer. https://github.com/microsoft/WSL/issues/4197
  22. Copyright © Accso – Accelerated Solutions GmbH 23 Der übliche

    Disclaimer: „Wer viel misst, misst viel Mist.“ Startup-Zeit Native-Image ist signifikant schneller im Startup. In HelloWorld-Beispiel mit Faktor >> 70! Da alles in das Native- Image verpackt ist, muss insbesondere keine JVM hochfahren. Memory Laufzeit Memory-Footprint am Beispiel 1) „helloworld“ Memory-Footprint am Beispiel 2) „mandelbrot“ Native-Images haben ein optimiertes Memory-Footprint.
  23. Copyright © Accso – Accelerated Solutions GmbH 24 Memory von

    Beispiel 1 „helloworld“ lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ /usr/bin/time --format %M java -cp target/ HelloWorld 48592 lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ /usr/bin/time --format %M ./target/helloworld 6112 lehmann@edwards03:~/graal/graalvm-native/helloworld $ $ man time ... M Maximum resident set size of the process during its lifetime, in Kilobytes.
  24. Copyright © Accso – Accelerated Solutions GmbH 27 Der übliche

    Disclaimer: „Wer viel misst, misst viel Mist.“ Startup-Zeit Native-Image ist signifikant schneller im Startup. In HelloWorld-Beispiel mit Faktor >> 70! Da alles in das Native- Image verpackt ist, muss insbesondere keine JVM hochfahren. Performance am Beispiel 1) „filefinder“ Performance am Beispiel 2) „mandelbrot“ Durchsatz am Beispiel 3) „quarkus-timeserver“ Laufzeit Auf lange Sicht ist die JVM durch Just-in-time- Optimierungen schneller als das Native-Executable. Memory Memory-Footprint am Beispiel 1) „helloworld“ Memory-Footprint am Beispiel 2) „mandelbrot“
  25. Copyright © Accso – Accelerated Solutions GmbH 28 Beispiel 1)

    „filefinder“ import java.io.*; FileFinder.java ... public class FileFinder { public static void main(String[] args) throws IOException { if (args.length < 3 || !args[1].equals("-name")) { System.err.println("java FileFinder <path> -name \"<glob_pattern>\""); System.exit(1); } Path startingDir = Paths.get(args[0]); String pattern = args[2]; Finder finder = new Finder(pattern); Files.walkFileTree(startingDir, finder); System.out.println("Matched: " + finder.numMatches); } }
  26. Copyright © Accso – Accelerated Solutions GmbH 29 class Finder

    extends SimpleFileVisitor<Path> { FileFinder.java cnt‘ed private final PathMatcher matcher; int numMatches = 0; Finder(String pattern) { matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); } void find(Path file) { Path name = file.getFileName(); if (name != null && matcher.matches(name)) { numMatches++; System.out.println(file.getFileName() + ": " + file.toFile().length()); } } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { find(file); return CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { find(dir); return CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) { System.err.println(exc);
  27. Copyright © Accso – Accelerated Solutions GmbH 30 Laufzeit für

    Beispiel 1) „filefinder“ time java -cp target FileFinder ${DIR} -name ${PATTERN} run.sh time ./target/filefinder ${DIR} -name ${PATTERN} time ./target/filefinderWithJS ${DIR} -name ${PATTERN} lehmann@edwards03:~/graal/graalvm-native/filefinder $ $ bash ./run.sh /home/lehmann/graal/ "*.java" 2>&1 | grep real real 0m0.823s // die Zeit für Graal/JVM-Modus real 0m0.267s // die Zeit für Graal/Native-Executable real 0m0.356s // die Zeit für Graal/Native-Executable mit JavaScript Laufzeit für das Native-Executable im Vergleich zum JVM-Modus sehr gut – aber Startup dominiert.
  28. Copyright © Accso – Accelerated Solutions GmbH 31 Beispiel 2)

    „mandelbrot“ • Java-Variante schreibt PNG-Datei raus. • Native-Image kann das z.Zt. leider nicht (AWT, ImageIO fehlen in Graal)! • Build funktioniert, aber dann Laufzeitfehler: • Zur Performance-Messung daher noch eine zweite „In-Memory“-Variante (Bildgröße ist skalierbar mit Faktor). Exception in thread "main" java.lang.UnsatisfiedLinkError: no awt in java.library.path at com.oracle.svm.core.jdk.NativeLibrarySupport. loadLibrary(NativeLibrarySupport.java:131) at java.lang.ClassLoader.loadLibrary(ClassLoader. java:270)
  29. Copyright © Accso – Accelerated Solutions GmbH 32 Laufzeit in

    Sekunden (weniger ist besser) Laufzeit „mandelbrot“ Komplexitätsfaktor: Mandelbrot-Bild wird in Memory als Vielfaches von 1024 erzeugt - 80% - 60% - 50% Graal 20.3.0 CE: JVM-Modus ist signifikant schneller als das Native-Image 34 s 191 s
  30. Copyright © Accso – Accelerated Solutions GmbH 33 Laufzeit in

    Sekunden (weniger ist besser) Laufzeit „mandelbrot“ Komplexitätsfaktor: Mandelbrot-Bild wird in Memory als Vielfaches von 1024 erzeugt - 50% - 30% - 10% Graal 20.3.0: EE Native Images sind signifikant schneller als CE, aber immer noch deutlich langsamer als JVM-Modus 191 s 88 s 34 s
  31. Copyright © Accso – Accelerated Solutions GmbH 34 Laufzeit in

    Sekunden (weniger ist besser) Laufzeit „mandelbrot“ Komplexitätsfaktor: Mandelbrot-Bild wird in Memory als Vielfaches von 1024 erzeugt - 30% Graal 20.3.0 CE: JVM-Modus ist signifikant schneller als Adopt OpenJDK 11 34 s 51 s
  32. Copyright © Accso – Accelerated Solutions GmbH 35 Laufzeit in

    Sekunden (weniger ist besser) Laufzeit „mandelbrot“ - Zusammenfassung 34 s 191 s 88 s 51 s
  33. Copyright © Accso – Accelerated Solutions GmbH 36 Laufzeit von

    Beispiel 3) „quarkus-timeserver“ Durchsatz mit jmeter Graal/JVM-Modus hat ca. 13% besseren Durchsatz als das Native-Image. Graal/ JVM-Modus Graal/ Native-Image
  34. Copyright © Accso – Accelerated Solutions GmbH 37 Vorsicht, Fallen!

    Performance: Wie schnell ist das wirklich? Einführung: Graal? Native-Image!
  35. Copyright © Accso – Accelerated Solutions GmbH 38 Dynamische Aspekte,

    die erst zur Laufzeit zum Tragen kommen und daher AOT nicht / unzureichend bekannt bzw. optimiert werden können: ✓ Reflection ✓ Property-Handling ✓ Resource-Handling ✓ Dynamic Proxy Siehe Github-Beispiele „reflection“, „properties“, „resources“ „dynamicproxy“ AOT muss alles Nötige bekannt sein, damit das Executable vollständig ist. Dabei hilft ein Java-Agent, der – beim normalen JVM-Start – die nötigen Infos (z.B. für Reflection) mitschneidet und als JSON-Dateien rausschreibt. Vollständigkeit hängt aber von Coverage ab! Dynamische Aspekte müssen AOT bekannt sein ✓ JNI ✓ Logging ? Konfiguration X Byte-Code-Enhancement
  36. Copyright © Accso – Accelerated Solutions GmbH 39 Beispiel „reflection“:

    Java-Agent erzeugt JSON-Files lehmann@edwards03:~/graal/graalvm-native/reflection $ $ ls target/META-INF/native-image jni-config.json proxy-config.json reflect-config.json resource-config.json lehmann@edwards03:~/graal/graalvm-native/reflection $ $ cat target/META-INF/native-image/reflect-config.json [ { "name":"StringManipulator", "methods":[ {"name":"capitalize","parameterTypes":["java.lang.String"] }, {"name":"reverse","parameterTypes":["java.lang.String"] } ] } ]
  37. Copyright © Accso – Accelerated Solutions GmbH 40 Beispiel „reflection“:

    native-image nutzt diese JSONs build.sh (gekuerzt) # create native-image with explicit reflection configuration ${GRAALVM_HOME}/bin/native-image \ --no-fallback \ -H:+PrintAnalysisCallTree -H:+ReportExceptionStackTraces \ -H:ReflectionConfigurationResources= \ ./META-INF/native-image/reflect-config.json \ ReflectionCaller reflectionCallerWithExplicitConfiguration
  38. Copyright © Accso – Accelerated Solutions GmbH 41 Laufzeit-Fehler und

    -Fallback auf JVM build.sh (gekuerzt) # create native-image with explicit reflection configuration ${GRAALVM_HOME}/bin/native-image \ --no-fallback \ -H:+PrintAnalysisCallTree -H:+ReportExceptionStackTraces \ -H:ReflectionConfigurationResources= \ ./META-INF/native-image/reflect-config.json \ ReflectionCaller reflectionCallerWithExplicitConfiguration Vorsicht Falle „Fallback“ Ohne „--no-fallback“ fällt das Native-Executable bei Problemen zur Laufzeit automatisch auf eine installierte JVM zurück (aus $PATH bzw. $JAVA_HOME). Für Reproduzierbarkeit also Fallback besser deaktivieren, es sei denn, man hat die Zielumgebung komplett unter Kontrolle.
  39. Copyright © Accso – Accelerated Solutions GmbH 42 Vorschlag •

    Funktionale Tests auf Basis des Java-Builds • Smoke-Tests / minimale Integrationstests auf Basis des Native-Images • Weitere Integrationstests auf Basis des N.I. anhand der Schnittstellen PS: Quarkus bietet @NativeImageTest Wie testet man ein Native Image?
  40. Copyright © Accso – Accelerated Solutions GmbH 43 Ein Fazit

    zur GraalVM und zu Native-Images Gut All-in-one-Sorglos-Binary- Paket mit „allem drin“. Startup-Zeiten sind sensationell schnell. Optimierter Speicherverbrauch Tool-Chain sehr stabil, z.B. auch Maven Selbst Polyglott integrierbar. Vieles funktioniert erwartungskonform (z.B. Exceptions, GC, …) Schlecht Performance: Auf lange Sicht ist die JVM nicht zu schlagen. Build-Zeiten sind exorbitant. Nicht alles nutzbar (z.B. AWT, ImageIO fehlen aktuell). Manche Fehler sieht man erst zur Laufzeit. Ungewohnt Monitoring zur Laufzeit ist … anders. VisualVM & Co funktionieren nicht. Man muss (oder darf) alte/altbekannte Unix-Tools wie strings, file, strace, ltrace, ldd und gdb wieder auspacken. GraalVM ist ein hochspannendes Projekt. Das ist die Zukunft der Java-Plattform. Ob man schon heute Native-Images nutzen möchte, sollte man sich aber sehr gut überlegen.
  41. Copyright © Accso – Accelerated Solutions GmbH 44 44 Copyright

    © Accso GmbH 44 Accso – Accelerated Solutions GmbH T | +49 6151 13029-0 E | [email protected] @ | www.accso.de Hilpertstraße 12 | 64295 Darmstadt Moltkestraße 131a | 50674 Köln Balanstraße 55 | 81541 München https://speakerdeck.com/mrtnlhmnn @mrtnlhmnn @accso https://accso.de/ https://accso.de/publikationen/