Vortrag am 7.7.2016 auf dem Klappe auf! Was macht die JVM denn da? Tobias@Frech.info / @TobiasFrech
Tobias Frech Geschäftsführer der Frech IT GmbH Java-Administration, Betrieb von Java-Anwendungen, Bereitschaft (1st-3rd-Level) Architekturberatung für Performance, Verfügbarkeit und Fehlertoleranz 2
Klappe auf! By Norbert Schnitzler (Own work) [GFDL (http://www.gnu.org/copyleft/fdl.html) or CC-BY-SA-3.0 (http://creativecommons.org/licenses/by-sa/3.0/)], via Wikimedia Commons 3
Server -Setup Raspberry Pi 3 Browser JMeter HTTP SSH Elasticsearch Panama tobi@xps (192.168.0.1) JVM pi@pi3 (192.168.0.5) 4
Demo Anwendung mit JMeter unter Last setzen und analysieren 5
JDK Admin-Tools Console GUI jps jconsole jinfo jvisualvm jstack jstat jmap zukünftig: https://docs.oracle.com/vase/8/ docs/technotes/tools/ jcmd 6
JVM Tools Monitoring und Mgmt. jps: listet die verfügbaren JVMs auf jinfo: Informationen über Parameter und JVMEnvironment jstat: Informationen über Classloading, Kompilierung und Garbage Collection jstack: Liste aller Threads mit momentaner Aktivität jmap: Histogramm und Dump des JVMSpeichers 7
Performance-Troubleshooting Analyse OSRessourcen CPU RAM Disk Prozesse CPU-Last Garbage Collection (GC) Analyse jstat, jmap Threaddump Analyse jstack, Sampler Ursache beheben oder kompensierende Maßnahmen: externe Systeme, Locks, Ursache bekannt? Ursache: GC? MemoryAnpassung, GC-Tuning, Memory-Analyse (Histogramm, Dump) Hybride Threaddump Analyse top -H, jstack 8
Tools für OS-Ressourcen CPU: top RAM: free Disk: df, du Prozesse: ps Langzeit bzw. nachträglich: sar: Collect, report, or save system activity information. 9
Performance-Troubleshooting Analyse OSRessourcen CPU RAM Disk Prozesse CPU-Last Garbage Collection (GC) Analyse jstat, jmap Threaddump Analyse jstack, Sampler Ursache beheben oder kompensierende Maßnahmen: externe Systeme, Locks, Ursache bekannt? Ursache: GC? MemoryAnpassung, GC-Tuning, Memory-Analyse (Histogramm, Dump) Hybride Threaddump Analyse top -H, jstack 10
JVM-Prozesse finden jps listet die lvmid aller für den ausführenden Benutzer monitorbaren JVMs auf -l für vollen Package-Namen -v für JVM-Argumente -m für Argumente an die main-methode jcmd wie jps, vereint auch alle Funktionen der anderen Tools und löst diese mittelfristig ab 11
JVM Monitoring Text basiert jstat -option jvmid [Interval] [Wiederholungen] Options: class, compiler, gc, gccapacity, gccause, gcnew, gcnewcapacity, gcold, gcoldcapacity, gcpermcapacity, gcutil, printcompilation 12
JVM Troubleshooting - Speicher Allgemeine statische GC-Informationen: Histogram der Heap-Objekte erzeugen: jmap -heap jvmid jmap -histo jvmid Dump des JVM-Heaps erzeugen: jmap -dump:format=b jvmid erzeugt Heap-Dump in Datei heap.bin nach heap.hprof umbenennen diese kann mit Eclipse Memory Analyzer auf Gründe von Memory Leaks analysiert werden (http://wiki.eclipse.org/index.php/memoryanalyzer) 13
Performance-Troubleshooting Analyse OSRessourcen CPU RAM Disk Prozesse CPU-Last Garbage Collection (GC) Analyse jstat, jmap Threaddump Analyse jstack, Sampler Ursache beheben oder kompensierende Maßnahmen: externe Systeme, Locks, Ursache bekannt? Ursache: GC? MemoryAnpassung, GC-Tuning, Memory-Analyse (Histogramm, Dump) Hybride Threaddump Analyse top -H, jstack 14
JVM Troubleshooting - Threads jstack listet alle Threads in dem spezifizierten JVMProzess zu jedem Thread wird der momentane Callstack ausgegeben Option -l listet auch Locks und Deadlocks Option -F (force) 15
Performance-Troubleshooting Analyse OSRessourcen CPU RAM Disk Prozesse CPU-Last Garbage Collection (GC) Analyse jstat, jmap Threaddump Analyse jstack, Sampler Ursache beheben oder kompensierende Maßnahmen: externe Systeme, Locks, Ursache bekannt? Ursache: GC? MemoryAnpassung, GC-Tuning, Memory-Analyse (Histogramm, Dump) Hybride Threaddump Analyse top -H, jstack 16
Hybride Threaddump Analyse top Batch-Modus möglich: -b Anzahl Interationen: -n 1 Threads statt Prozesse anzeigen: -H Die angezeigte Prozess-ID pro Thread ist auch die Thread-ID in der JVM jstack Prozess-ID 23679 (dezimal) ist in Hex 5c7f => nid=0x5c7f 17
JVM Environment OS Environment (PATH etc.) und JVM Environment (System Properties) sind getrennt Werte für das JVM-Environment können durch Programme oder von außen beim Start der JVM mit -Dname=wert gesetzt werden jinfo (unter JDK5 nicht für Windows verfügbar) 18
JVM Flags Auswahl verschiedener Implementierung und Ausgaben direkt in der JVM Logs zu GC, Compiler, Safe Points, Class Loading Funktionsweise: -XX:+AktivierteOption -XX:-DeaktivierteOption -XX:GroessenEinstellung=200m Kontrolle und Vergleich zwischen JVM-Versionen: va -XX:+PrintFlagsFinal -version 19
Code Cache und Compilation Defaults JDK 7 (Update 80) -TieredCompilation ReservedCodeCacheSize=50m +UseCodeCacheFlushing Defaults JDK 8 (Update 91) +TieredCompilation ReservedCodeCacheSize=250m +UseCodeCacheFlushing 20
Performance-Troubleshooting Analyse OSRessourcen CPU RAM Disk Prozesse CPU-Last Garbage Collection (GC) Analyse jstat, jmap Threaddump Analyse jstack, Sampler Ursache beheben oder kompensierende Maßnahmen: externe Systeme, Locks, Ursache bekannt? Ursache: GC? MemoryAnpassung, GC-Tuning, Memory-Analyse (Histogramm, Dump) Hybride Threaddump Analyse top -H, jstack 21
JVM Agent aktivieren Lokal aktivieren: JDK 5: -Dcom.sun.management.jmxremote JDK 6+ : nix, dank Attach API remote öffnen: -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false bei Problemen RMI-Name setzen: -Dva.rmi.server.hostname=... 22
JMX nachträglich aktivieren jcmd 1234 ManagementAgent.start jmxremote.port=5454 jmxremote.ssl=false jmxremote.authenticate=false ManagementAgent.stop JMX-Agents sollten auf kritischen Systemen niemals ohne SSL und Authentifizierung gestartet sein! 23
Vielen Dank! Fragen? 24