SlideShare ist ein Scribd-Unternehmen logo
1 von 11
Downloaden Sie, um offline zu lesen
SPRING5
magazin
JAVAMag
Datenbankmigration
mit Liquibase S. 89
Agile
Produktentwicklung S. 76
Java 9 mit
Projekt Jigsaw S. 12
Java | Architektur | Software-Innovation
Depiano/Shutterstock.com
www.javamagazin.de
Deutschland €9,80
Österreich € 10,80
Schweiz sFr 19,50
Luxemburg €11,15
Ausgabe 5.2017
DerLenzistda
Programminfos
ab Seite 35!
JavaMagazin5.2017		Java9AgileSpringDatenbankenAngularEclipseJavaScript
javamagazin 5|2017
Java Core Flight Recorder
20 www.JAXenter.de
von Wolfgang Weigend
Der Java Flight Recorder bildet zusammen mit der Ma-
nagementkonsole Java Mission Control ein Toolset für
Java. Java Mission Control (JMC) ist ein etabliertes
Werkzeug für das Monitoring, Profiling und die Diag-
nose von Java-Anwendungen. Es ist im Oracle JDK ent-
halten und lässt sich mit beliebigen Java-Anwendungen
und Applikationsservern verwenden, von der Entwick-
lung bis zum produktiven Betrieb. Als Bundle mit der
HotSpot Java Virtual Machine ist JMC als Client oder
als Eclipse-Version seit dem Oracle JDK 7 Update 40
verfügbar. Es basiert auf dem Eclipse RCP.
Mit dem Kommando C:JAVA_HOMEbinjmc.
exe wird Java Mission Control beispielsweise unter
Microsoft Windows gestartet. JMC lässt sich über ein
Oracle-Plug-in auch direkt in die Eclipse-IDE integrie-
ren. Die auf dem System laufenden Java-Prozesse wer-
den in einer Baumstruktur im JVM-Browser angezeigt,
und mittels Doppelklick wird der darunter liegende
MBean-Server oder der Flight Recorder ausgewählt. Der
MBean-Server vom Clock Applet Viewer zeigt allgemei-
ne Informationen zum Prozessor- und Heap-Verbrauch,
Memory, Code, Threads, I/O, Systeminformationen
und Eventtypen an (Abb. 1). Wird der Flight Recorder
per Doppelklick ausgewählt, bekommt man zuerst den
Hinweis, dass die kommerziellen Features nicht freige-
geben sind. Seit JDK 8 Update 40 wird gefragt, ob man
die kommerziellen Features zum Start des Flight Recor-
ding automatisch freigeben möchte, mit dem Hinweis,
dass die kommerziellen Features dem Oracle Binary
Code License Agreement unterliegen [5].
Nach einer positiven Antwort wird der Flight Re-
corder Wizard aktiviert und bietet die Aufnahme-
dauer von beispielsweise einer Minute an. Im darauf
folgenden Wizard-Dialog können die Aufzeichnungs-
parameter ausgewählt werden. Sämtliche Konfigura-
tionsparameter der grafischen Oberfläche lassen sich
auch über die Kommandozeilenebene JDK/bin/jcmd
<pid> <cmd> einstellen (Listing 1). Existierende JFR-
Plug-ins gibt es für WebLogic und JavaFX. Andere
Java-Programme lassen sich über die Kommandozei­
len­ebene mit dem Flight Recorder ebenfalls aufzeich-
nen. Die JFR-Freigabeparameter können dauerhaft in
der Konfigurationsdatei C:JAVA_HOMEbinjmc.ini
für die JVM gesetzt werden:
-XX:+UnlockCommercialFeatures
-XX:+FlightRecorder
-XX:FlightRecorderOptions=defaultrecording=true
Java Flight Recorder
Der Flugdatenschreiber
Der Java Flight Recorder ist mit einem echten Flugdatenschreiber vergleichbar. Die auf ihm gespeicher-
ten Informationen werden wichtig, wenn etwas schief gelaufen ist. Mit seiner einheitlichen Datenbasis
hilft der Flight Recorder außerdem Administratoren und Entwicklern dabei, gemeinsam an Problemlö-
sungen zu arbeiten und Konflikte besser und schneller bewältigen zu können.
Entstehung der Werkzeuge
Die ursprüngliche Entwicklung der Werkzeuge JRockit Mission
Control Console, JRockit Runtime Analyzer, JRockit Memory
Leak Detector und JRCMD (CLI für Diagnosekommandos) fand
im JRockit Virtual Machine Team statt. Unter BEA Systems
wurde der Runtime Analyzer durch den JRockit Flight Recor-
der ersetzt. Mit der Firmenübernahme von BEA Systems und
Sun Microsystems durch Oracle wurde Java Mission Control
(JMC) und Java Flight Recorder (JFR) für die HotSpot JVM im
Oracle JDK 7 Update 40 weiterentwickelt. Es ist mit der Ver-
sion JMC und JFR 5.5, basierend auf Eclipse 4.4, im Oracle
JDK 8 enthalten [1] und für die Betriebssysteme Microsoft
Windows, Linux und Mac OS X zertifiziert [2]. JMC und JFR sind
als eingebundene Werkzeuge mit Java SE Advanced Support
paketiert [3], [4], sodass sie nur über einen expliziten Java-
SE-Advanced-Support-Vertrag kommerziell verwendet werden
dürfen. Die kostenfreie Verwendung von JMC und JFR ist nur zum
Selbststudium oder zur privaten Eigenentwicklung erlaubt. JMC
ermöglicht das direkte JVM-Online-Monitoring mittels JMX und
visualisiert die vom JFR gesammelten Daten. JFR übernimmt die
Offline-Profiling- und Diagnosefunktion während des gesamten
Applikationslebenszyklus, von der Anwendungsentwicklung über
Test, Integration bis zum Anwendungsbetrieb mit einer kontinu-
ierlichen Optimierung.
javamagazin 5 |2017
Java CoreFlight Recorder
21www.JAXenter.de
Architektur des Java Flight Recorders
Der Java Flight Recorder ist ein Event Recorder, der
direkt mit der Java Virtual Machine (JVM) verzahnt
ist und alle verfügbaren JVM-Laufzeitparameter lie-
fert [6]. Die Messung zeigt das tatsächliche Verhalten
der eingeschalteten JVM-Optimierungsparameter. Die
Aufzeichnung erfolgt in einem kompakten Binärfor-
mat, das alle notwendigen Informationen zur späteren
Analyse und Diagnose enthält. Das proprietäre Binär-
format ist für schnelles Schreiben und Lesen ausgelegt
und lässt sich komprimieren. Der Mehraufwand für
die Aufzeichnung beträgt rund drei Prozent einer be-
stehenden Anwendungsinfrastruktur. Der Einsatz vom
JFR wurde für den dauerhaften Betrieb konzipiert, eine
JFR-Datei lässt sich jederzeit erzeugen. Kontinuierli-
che Aufnahmen haben kein definiertes Ende, und man
muss eine JFR-Datei über dumponexit=true explizit er-
zeugen. Es lassen sich aber auch zeitlich fest definierte
Aufnahmen durchführen.
Der Flight Recorder sammelt über Events sowohl die
Informationen der JVM durch interne APIs als auch die
Daten der darauf laufenden Java-Anwendung über das
Java-API. Die erzeugten Daten werden in kleine lokale
Threadbuffer gespeichert. Nach dem Erreichen der ma-
ximalen Threadbufferkapazität werden sie in globale
In-Memory-Buffer kopiert und schließlich auf die Fest-
platte geschrieben. Dabei gibt es keine überlappenden
Informationen der Threadbuffer und Globalbuffer, so-
dass sich ein betreffendes Datensegment entweder noch
im Speicherbereich der Bufferstruktur befindet oder be-
reits auf die Festplatte gespeichert worden ist (Abb. 2).
Durch die gleichzeitige Aufnahme von Java-Anwen-
dungsinformationen und den JVM-Informationen, wie
Class Loading, Code-Cache-Compiler, Garbage Col­
Abb. 1: Beim Start zeigt der MBean-Server vom Clock Applet Viewer allgemeine Informationen an, z. B. zum Prozessor- und Heap-Verbrauch,
Memory oder Threads
Listing 1: Kommandozeilenbeispiel „jcmd“ mit Flight Recording für Clock Applet
C:>jcmd
1936
7108 sun.plugin2.main.client.PluginMain
read_pipe_name=jpi2_pid1936_pipe1,
write_pipe_name=jpi2_pid1936_pipe2
4264
7512 sun.tools.jcmd.JCmd
C:jcmd 7108 help
7108:
The following commands are available:
JFR.stop
JFR.start
JFR.dump
JFR.check
VM.check_commercial_features
VM.unlock_commercial_features
..
For more information about a specific command 
use 'help command'.
C:jcmd 7108 VM.unlock_commercial_features
7108:
Commercial Features now unlocked.
C:jcmd 7108 JFR.start name=MyRecording 
settings=profile delay=20s duration=2m 
filename=c:tempmyrecording.jfr
7108:
Recording 3 scheduled to start in 20 s. The 
result will be written to:
C:tempmyrecording.jfr
javamagazin 5|2017
Java Core Flight Recorder
22 www.JAXenter.de
lec­tor und Laufzeitumgebung, bekommt man eine ein-
heitliche Sicht zur fokussierten Analyse und Diagnose.
Aus der JMC-Konsole lässt sich über Create a new
connection die Remote-Verbindung zu einer entfern-
ten JVM herstellen, unter Angabe von Hostnamen, Port
und Benutzer mit Passwort.
JFR-Aufzeichnungsbeispiele und Analyse
Es gibt zwei Arten von Aufzeichnungen. Die erste Va-
riante besteht aus kontinuierlichen JFR-Aufnahmen
ohne definiertes Ende. Man muss durch ein explizites
Dump-Kommando oder mit dem Diagnostic-Komman-
do JFR.dump das laufende Flight Recording beenden.
Dabei können die letzten Minuten vor einem Fehler
ausgegeben werden. Die zweite Aufzeichnungsvariante
besitzt eine feste Aufnahmezeit und wird als Profiling
Recording bezeichnet. Falls diese aus der Java Mission
Control Console gestartet wurde, wird die grafische
Oberfläche automatisch mit der aufgezeichneten JFR-
Datei geöffnet. Diese Variante wird bei Performance-
und Lasttests empfohlen, um beispielsweise 30 Minuten
aufzuzeichnen. Zum besseren Analyseverständnis ist es
notwendig, die Anwendung zu kennen und zu wissen,
ob hoher Durchsatz oder niedrige Latenzzeiten im Vor-
dergrund stehen, oder wie hoch der Prozessorverbrauch
tatsächlich sein soll. Zur Flight-Recording-Analyse be-
Abb. 2: Die Architektur des Java Flight Recordes
Problem Lösung
Lock contention + Monitor enter events
Excessive class loading + Class loading events
Expenses of redundant exception logging + Through method profiling information and lock contention information
Context switches + Through context switch rate events
Processor burn rate + Method profiling events
GC thrashing + All the various GC events
Tabelle 1: Beispielszenarien zur Diagnose interner JVM-Information mit JMC/JFR 5.5
Listing 2: Codebeispiel „02_JFR_HotMethods HotMethods.java“
import java.io.IOException;
import com.oracle.jrockit.jfr.EventToken;
import com.oracle.jrockit.jfr.InstantEvent;
import com.oracle.jrockit.jfr.Producer;
public class HotMethods {
// Hint: You may want to set NUMBER_OF_THREADS
// close to the number of hardware threads for
// maximum saturation
private static final int NUMBER_OF_THREADS = 4;
private static final String PRODUCER_URI = http:// 
www.oracle.com/jmc/tutorial/example2;
static final Producer PRODUCER;
static final EventToken WORK_EVENT_TOKEN;
static {
PRODUCER = createProducer();
WORK_EVENT_TOKEN = createToken(WorkEvent. 
class);
PRODUCER.register();
}
/**
* Creates our event token.
*/
public static EventToken createToken(Class?
extends InstantEvent clazz) {
try {
return PRODUCER.addEvent(clazz);
} catch (Exception e) {
// Add proper exception handling.
e.printStackTrace();
}
return null;
}
/**
* Creates our producer.
*/
private static Producer createProducer() {
try {
return new Producer(Tutorial Example 2,
A demo event producer for the HotMethods 
Example., PRODUCER_URI);
} catch (Exception e) {
// Add proper exception handling.
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws 
IOException {
Thread[] threads = new Thread[NUMBER_OF_ 
THREADS];
for (int i = 0; i  threads.length; i++ ) {
threads[i] = new Thread(new Worker(), Worker 
Thread  + i);
threads[i].setDaemon(true);
threads[i].start();
}
System.out.print(Press enter to quit!);
System.out.flush();
System.in.read();
}
}
Anzeige
javamagazin 5|2017
Java Core Flight Recorder
24 www.JAXenter.de
nötigt man ein gewisses Maß an Erfahrung und Übung
im Umgang mit den Werkzeugen (Tabelle 1). Die prak-
tischen Übungen aus dem Java Mission Control Tuto-
rial [7] von Marcus Hirt [8] verdeutlichen den Umgang
mit dem Java Flight Recorder.
Lässt man das Beispiel 02_JFR_HotMethods mit
Eclipse laufen (Listing  2) und startet den Flight Re-
corder, erkennt man in der Aufzeichnung flight_
recording_18045HotMethods3224.jfr (Abb.  3), dass
viel Zeit in der Methode LinkedList.indexOf(Object)
verbracht wird. Schaut man sich die Aufzeichnung in
der JMC-Konsole unter dem Menüpunkt Code und
Hot Methods an, erkennt man, dass die Methode
contains durchlaufen wird. contains verhält sich in ei-
ner LinkedList proportional zur Anzahl der Einträge.
Durch ein HashSet könnte dies in kürzerer Zeit ablau-
fen. Mit einem Blick auf die JMC-Konsole unter dem
Menüpunkt Code und der Ansicht Call Tree kann
man herausfinden, wo contains aufgerufen wird. Folgt
man im Stack Trace dem größten Ressourcenver-
brauch von 99,85 Prozent bei java.lang.Thread.run(),
gelangt man zu java.util.LinkedList.indexOf(Object)
mit einem hohen Ressourcenverbrauch von 99,37 Pro-
zent. Ersetzt man im Programmcode Initiator.java (Lis-
ting 3) die Zeile collection = new LinkedListInteger();
mit collection = new HashSetInteger();, läuft das
Programmbeispiel JFR_HotMethods viel schneller
und spart Ressourcen, wie in der Aufzeichnung flight_
recording_18045HotMethods948.jfr in Abbildung  4
dargestellt.
Das nächste Codebeispiel verdeutlicht das Allokati-
onsverhalten, hervorgerufen durch eine ungünstige Aus-
wahl von Datentypen. Wird das Beispiel 04_JFR_GC
mit dem Programm Allocator.java (Listing  4) in der
Listing 3: Codebeispiel „02_JFR_­HotMethods Initiator.java“
import java.util.*;
public class Initiator {
private CollectionInteger collection;
public Initiator() {
collection = new LinkedListInteger();
// collection = new HashSetInteger();
}
// Hint: This creates a list of unique
// elements!
public void initiate(int seed) {
collection.clear();
for (int i = 1; i  10000; i++) {
if ((i % seed) != 0)
collection.add(i);
}
}
protected CollectionInteger getCollection()
{
return collection;
}
public int countIntersection(Initiator other) {
int count = 0;
for (Integer i : collection) {
if (other.getCollection().contains(i)) {
count++;
}
}
return count;
}
}
Abb. 3: Die JMC-Call-Tree-Ansicht für „flight_recording_18045HotMethods3224.jfr“ zeigt, dass viel Zeit in der Methode „LinkedList.
indexOf(Object)“ verbracht wird
Anzeige
javamagazin 5|2017
Java Core Flight Recorder
26 www.JAXenter.de
Eclipse-IDE gestartet und aktiviert man den Flight Re-
corder, erkennt man in der JMC-Konsole unter dem
Menüpunkt Memory und Garbage Collection ei-
nen extrem breiten ansteigenden Sägezahnverlauf in der
Aufzeichnung flight_recording_18045Allocator6764.
jfr (Abb.  5), der den Used-Heap-Verbrauch mit ca.
22 MB zeigt. Nun stellt sich die Frage, welche Objek-
te am häufigsten allokiert werden. Es sind reichlich
Integer-Allokationen vorhanden. Daraus ergibt sich die
nächste Frage: Was hat die Allokationen und die Gar-
bage Collections verursacht? Die JMC-Console-Ansicht
Code, Call Tree und Stack Trace mit java.util.
HashMap$ValueIterator.next() lässt erahnen, dass die
Allokationen durch CollectionMyAlloc myAllocSet
= map.values(); verursacht worden sein könnten, weil
Allocator ständig den Primitive Type int zum Object
Type Integer umgewandelt hat, siehe auch Codezeile if
(!map.containsKey(c.getId())) in Listing 4. Falls Primi­
tive Types als Index in HashMaps verwendet werden, ist
es besser, die Object-Type-Version zu speichern als stän-
dig zwischen dem Primitive Type int und dem Object
Type Integer hin und her zu wechseln. Ersetzt man jeden
Primitive Type int mit dem Object oder Reference Type
Integer in der Klasse MyAlloc, reduziert sich die Anzahl
der Garbage Collections erheblich. Nach der Codeän-
derung in Allocator.java (Listing 5) zeigt die Aufzeich-
nung flight_recording_18045Allocator1432.jfr (Abb. 6)
den ansteigenden Sägezahnverlauf, aber ohne die zuvor
Abb. 4: Nach der Codeänderung ist das Programm schneller und spart Ressourcen, wie die Call-Tree-Ansicht für „flight_
recording_18045HotMethods948.jfr“ zeigt
Listing 4: Codebeispiel „04_JFR_GC ­Allocator.java“ mit „int“ und „Integer“
import java.util.Collection;
import java.util.HashMap;
public class Allocator {
private HashMapInteger, MyAlloc map = new 
HashMapInteger, MyAlloc();
private static class MyAlloc {
private int id;
private MyAlloc(int id) {
this.id = id;
}
private int getId() {
return id;
}
}
public static void main(String[] args) {
new Allocator().go();
}
private void go() {
alloc(10000);
long yieldCounter = 0;
while(true) {
CollectionMyAlloc myAllocSet = map.values();
for (MyAlloc c : myAllocSet ) {
if (!map.containsKey(c.getId()))
System.out.println(Now this is strange!);
if (++yieldCounter % 1000 == 0)
Thread.yield();
}
}
}
private void alloc(int count) {
for (int i = 0; i  count; i++) {
map.put(i, new MyAlloc(i));
}
}
}
javamagazin 5 |2017
Java CoreFlight Recorder
27www.JAXenter.de
sichtbare breite Verzerrung, und der Used-Heap-Ver-
brauch hat sich auf rund 8 MB verringert.
Fazit und Ausblick
Die Verwendung der Werkzeuge Java Mission Con-
trol und Java Flight Recorder bringt einige Vorteile,
weil man schneller und strukturiert potenzielle Feh-
ler erkennt. Aufgrund der gemeinsamen Datenbasis
mit JFR-Dateien können Entwickler, Administratoren
und Supportmitarbeiter während des gesamten Appli-
kationslebenszyklus besser zusammenarbeiten, ohne
lästiges Verschieben von Zuständigkeiten oder abge-
grenzten Verantwortungsbereichen. Voraussetzung für
ein erfolgreiches Zusammenspiel der unterschiedlichen
Abb. 5: Die Garbage-Collections-Ansicht für „flight_recording_18045Allocator6764.jfr“ zeigt einen steilen Sägezahnanstieg
IT-Rollen ist, dass jeder in seinem Gebiet genügend Er-
fahrungen mit den eingesetzten Unternehmensanwen-
dungen inklusive den passenden Werkzeugen sammeln
kann und sich strukturiert mit seinen Kollegen austau-
schen kann. Mit der zunehmenden Komplexität der
Anwendungslandschaft wächst auch die Werkzeugaus-
stattung von Entwicklern und Administratoren in den
Unternehmen. Dass die Werkzeuge Bestandteil vom
Oracle-Java-SE-Advanced-Support sind [3], ist oft eine
Hürde. Die Unternehmen, die sich einer notwendigen
Java-Werkzeugausstattung für ihre IT-Umgebung be-
wusst sind, wählen zwischen Third-Party-Werkzeugen
und den JMC-/JFR-Werkzeugen aus und haben auch ein
Budget dafür eingeplant. Im anderen Fall versuchen Un-
Listing 5: Codebeispiel „04_JFR_GC ­Allocator.java“ mit Integer
import java.util.Collection;
import java.util.HashMap;
public class Allocator {
private HashMapInteger, MyAlloc map = new 
HashMapInteger, MyAlloc();
private static class MyAlloc {
private Integer id;
private MyAlloc(Integer id) {
this.id = id;
}
private Integer getId() {
return id;
}
}
public static void main(String[] args) {
new Allocator().go();
}
private void go() {
alloc(10000);
long yieldCounter = 0;
while(true) {
CollectionMyAlloc myAllocSet = map.values();
for (MyAlloc c : myAllocSet ) {
if (!map.containsKey(c.getId()))
System.out.println(Now this is strange!);
if (++yieldCounter % 1000 == 0)
Thread.yield();
}
}
}
private void alloc(Integer count) {
for (Integer i = 0; i  count; i++) {
map.put(i, new MyAlloc(i));
}
}
}
javamagazin 5|2017
Java Core Flight Recorder
28 www.JAXenter.de
ternehmen ohne Werkzeugbeschaffung auszukommen
oder jeweils die einzelnen Entwickler und Administra-
toren in die Pflicht zu nehmen, oft mit positiven Effek-
ten beim Einsatz von Open-Source-Werkzeugen. Aber
auch mit den damit verbundenen Mehraufwendungen
bei fehlenden Merkmalen oder kritischen Problemfäl-
len, falls Performanceexperten als Feuerwehr ad hoc in
die Unternehmen kommen müssen. In jedem Fall sind
Kosten zu berücksichtigen, einerseits für die nötigen
Werkzeuge und andererseits für Consulting.
Hinter den Werkzeugen Java Mission Control und
Java Flight Recorder steht ein Entwicklungsteam, das
größtenteils in Stockholm arbeitet und die Werkzeuge
kontinuierlich weiterentwickelt. Die Roadmap sieht
für JMC 6.0 mit JDK 9 eine automatische Analyse der
Flight Recordings vor, und die Benutzeroberfläche soll
modernisiert werden. Außerdem sollen neue Eventtypen
kommen:
•	 Detaillierte Safe-Point-Informationen
•	 Detaillierte Code-Cache-Informationen
•	 Compilerevents mit detaillierten Inlining-Informati-
onen
•	 Garbage-First-Informationen mit verbesserter Zu-
standsvisualisierung der Memory-Regionen
•	 Modulevents für geladene Module
•	 Unterstützung von nativen geladenen Bibliotheken
mit periodischen Events
Zu den Verbesserungen zählen auch neue APIs, die bei
der Verwendung von Custom-Events unterstützen. Der
programmatische Zugriff zum Lesen von Flight Recor-
dings und zur Kontrolle vom Flight Recorder sowie die
Modularisierungsunterstützung mit kleineren Profilen
Abb. 6: „flight_recording_18045Allocator1432.jfr“ zeigt den Sägezahnverlauf, aber ohne Verzerrungen, und der Used Heap hat sich verringert
werden einfacher zu benutzen sein. Zudem wird der
Namespace von oracle.jrockit.* nach jdk.jfr.* geändert.
Letztlich steht der JMC-JFR-Memory-Leak-Detektor un-
ter Vorbehalt auf der Wunschliste für die Roadmap. Die
geplante Auslieferung von JMC 6.0 ist mit der JDK-9-­
Releasefreigabe [9] für den 27. Juli 2017 vorgesehen.
Wolfgang Weigend arbeitet als Sen. Leitender Systemberater bei
der Oracle Deutschland B.V.  Co. KG. Er beschäftigt sich mit
­Java-Technologie und Architektur für unternehmensweite Anwen-
dungsentwicklung.
Links  Literatur
[1] Java Mission Control 5.5 Release Notes: http://www.oracle.com/
technetwork/java/javase/jmc55-release-notes-2412446.html
[2] Oracle Java Mission Control 5.5 Certified System Configurations: http://
www.oracle.com/technetwork/java/javaseproducts/documentation/jmc-
5-5-certified-system-config-2432060.html
[3] Java Components: https://docs.oracle.com/javacomponents/index.html
[4] Oracle Java SE and Oracle Java Embedded Products: http://www.oracle.
com/technetwork/java/javase/terms/products/index.html
[5] Oracle Binary Code License Agreement for the Java SE Platform Products
and JavaFX: http://www.oracle.com/technetwork/java/javase/terms/
license/index.html
[6] Java Platform, Standard Edition Java Flight Recorder Runtime Guide:
https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/
toc.htm
[7] JMC Tutorial: http://hirt.se/downloads/oracle/jmc_tutorial.zip
[8] Blog von Marcus Hirt: http://hirt.se/blog/
[9] JDK 9: http://openjdk.java.net/projects/jdk9/
www.entwickler.de
Java-Magazin-Abonnement abschließen auf www.entwickler.de
Jetzt abonnieren und
3 TOP-VORTEILE sichern!
Im entwickler.kiosk immer
und überall online lesen –
am Desktop und mobil
Mit vergünstigtem Upgrade
auf das gesamte Angebot
im entwickler.kiosk
zugreifen
Alle Printausgaben
frei Haus erhalten

Weitere ähnliche Inhalte

Ähnlich wie Java Flight Recorder Javamagazin May 2017

Compilers Everywhere
Compilers EverywhereCompilers Everywhere
Compilers Everywhereberndmueller
 
Java FX8 JumpStart - JUG ch - zürich
Java FX8   JumpStart - JUG ch - zürichJava FX8   JumpStart - JUG ch - zürich
Java FX8 JumpStart - JUG ch - zürichSven Ruppert
 
Bkr Workflow Oeffentlich
Bkr Workflow OeffentlichBkr Workflow Oeffentlich
Bkr Workflow OeffentlichRalf Ruethlein
 
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungOSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungNETWAYS
 
Camera Manual Cam Lab
Camera Manual  Cam LabCamera Manual  Cam Lab
Camera Manual Cam Labguest794988
 
Tanuki service wrapper_101
Tanuki service wrapper_101Tanuki service wrapper_101
Tanuki service wrapper_101inovex GmbH
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007smancke
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshopargency
 
Java-Anwendungen betreiben mit Durchblick
Java-Anwendungen betreiben mit DurchblickJava-Anwendungen betreiben mit Durchblick
Java-Anwendungen betreiben mit DurchblickTobias Frech
 
Informatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und GrailsInformatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und Grailsschmichri
 
Effizienter Hardware LifeCycle auf Oracle SPARC M7 Server
Effizienter Hardware LifeCycle auf Oracle SPARC M7 ServerEffizienter Hardware LifeCycle auf Oracle SPARC M7 Server
Effizienter Hardware LifeCycle auf Oracle SPARC M7 ServerJomaSoft
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Marc Müller
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?Marc Müller
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungengedoplan
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOpsAndreas Koop
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Springdenschu
 

Ähnlich wie Java Flight Recorder Javamagazin May 2017 (20)

Compilers Everywhere
Compilers EverywhereCompilers Everywhere
Compilers Everywhere
 
Java FX8 JumpStart - JUG ch - zürich
Java FX8   JumpStart - JUG ch - zürichJava FX8   JumpStart - JUG ch - zürich
Java FX8 JumpStart - JUG ch - zürich
 
Bkr Workflow Oeffentlich
Bkr Workflow OeffentlichBkr Workflow Oeffentlich
Bkr Workflow Oeffentlich
 
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungOSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
 
Camera Manual Cam Lab
Camera Manual  Cam LabCamera Manual  Cam Lab
Camera Manual Cam Lab
 
Tanuki service wrapper_101
Tanuki service wrapper_101Tanuki service wrapper_101
Tanuki service wrapper_101
 
Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007Jalimo Slides Linuxtag2007
Jalimo Slides Linuxtag2007
 
Die Java Plattform Strategie
Die Java Plattform StrategieDie Java Plattform Strategie
Die Java Plattform Strategie
 
Augmented Reality Workshop
Augmented Reality WorkshopAugmented Reality Workshop
Augmented Reality Workshop
 
Java-Anwendungen betreiben mit Durchblick
Java-Anwendungen betreiben mit DurchblickJava-Anwendungen betreiben mit Durchblick
Java-Anwendungen betreiben mit Durchblick
 
Informatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und GrailsInformatik Seminar Groovy Und Grails
Informatik Seminar Groovy Und Grails
 
Effizienter Hardware LifeCycle auf Oracle SPARC M7 Server
Effizienter Hardware LifeCycle auf Oracle SPARC M7 ServerEffizienter Hardware LifeCycle auf Oracle SPARC M7 Server
Effizienter Hardware LifeCycle auf Oracle SPARC M7 Server
 
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
Karlsruher Entwicklertag 2016 - Monitoring 2.0: Alles im Lot?
 
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
DWX 2016 - Monitoring 2.0 - Monitoring 2.0: Alles im Lot?
 
Monitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-AnwendungenMonitoring und Profiling von Java-Anwendungen
Monitoring und Profiling von Java-Anwendungen
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOps
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOps
 
GWT
GWTGWT
GWT
 
MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Enterprise Java Batch mit Spring
Enterprise Java Batch mit SpringEnterprise Java Batch mit Spring
Enterprise Java Batch mit Spring
 

Mehr von Wolfgang Weigend

It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15
It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15
It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15Wolfgang Weigend
 
It's a jdk jungle out there - JDK 11 and OpenJDK 11
It's a jdk jungle out there - JDK 11 and OpenJDK 11It's a jdk jungle out there - JDK 11 and OpenJDK 11
It's a jdk jungle out there - JDK 11 and OpenJDK 11Wolfgang Weigend
 
The JDK 8 end of public updates and the Java SE subscription
The JDK 8 end of public updates and the Java SE subscription The JDK 8 end of public updates and the Java SE subscription
The JDK 8 end of public updates and the Java SE subscription Wolfgang Weigend
 
Microservices and Container
Microservices and ContainerMicroservices and Container
Microservices and ContainerWolfgang Weigend
 
JDK 9 Java Platform Module System
JDK 9 Java Platform Module SystemJDK 9 Java Platform Module System
JDK 9 Java Platform Module SystemWolfgang Weigend
 
fn project serverless computing
fn project serverless computingfn project serverless computing
fn project serverless computingWolfgang Weigend
 
Development with JavaFX 9 in JDK 9.0.1
Development with JavaFX 9 in JDK 9.0.1Development with JavaFX 9 in JDK 9.0.1
Development with JavaFX 9 in JDK 9.0.1Wolfgang Weigend
 
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawJavamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawWolfgang Weigend
 
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergehtDas 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergehtWolfgang Weigend
 
Automated testing of JavaFX GUI components
Automated testing of JavaFX GUI componentsAutomated testing of JavaFX GUI components
Automated testing of JavaFX GUI componentsWolfgang Weigend
 
Java mission control and java flight recorder
Java mission control and java flight recorderJava mission control and java flight recorder
Java mission control and java flight recorderWolfgang Weigend
 
Automated testing of JavaFX UI components
Automated testing of JavaFX UI componentsAutomated testing of JavaFX UI components
Automated testing of JavaFX UI componentsWolfgang Weigend
 
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollWolfgang Weigend
 
JDK 8 and JDK 8 Updates in OpenJDK
JDK 8 and JDK 8 Updates in OpenJDKJDK 8 and JDK 8 Updates in OpenJDK
JDK 8 and JDK 8 Updates in OpenJDKWolfgang Weigend
 

Mehr von Wolfgang Weigend (17)

It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15
It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15
It's a JDK- Jungle Out There – JDK 15 and OpenJDK 15
 
It's a jdk jungle out there - JDK 11 and OpenJDK 11
It's a jdk jungle out there - JDK 11 and OpenJDK 11It's a jdk jungle out there - JDK 11 and OpenJDK 11
It's a jdk jungle out there - JDK 11 and OpenJDK 11
 
The JDK 8 end of public updates and the Java SE subscription
The JDK 8 end of public updates and the Java SE subscription The JDK 8 end of public updates and the Java SE subscription
The JDK 8 end of public updates and the Java SE subscription
 
JDK versions and OpenJDK
JDK versions and OpenJDKJDK versions and OpenJDK
JDK versions and OpenJDK
 
JDK 10 Java Module System
JDK 10 Java Module SystemJDK 10 Java Module System
JDK 10 Java Module System
 
Microservices and Container
Microservices and ContainerMicroservices and Container
Microservices and Container
 
JDK 9 Java Platform Module System
JDK 9 Java Platform Module SystemJDK 9 Java Platform Module System
JDK 9 Java Platform Module System
 
fn project serverless computing
fn project serverless computingfn project serverless computing
fn project serverless computing
 
Development with JavaFX 9 in JDK 9.0.1
Development with JavaFX 9 in JDK 9.0.1Development with JavaFX 9 in JDK 9.0.1
Development with JavaFX 9 in JDK 9.0.1
 
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsawJavamagazin 1.2016 jdk9_ea_b83_jigsaw
Javamagazin 1.2016 jdk9_ea_b83_jigsaw
 
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergehtDas 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
Das 1×1 des java supports wie die wartung älterer jdk-versionen weitergeht
 
Automated testing of JavaFX GUI components
Automated testing of JavaFX GUI componentsAutomated testing of JavaFX GUI components
Automated testing of JavaFX GUI components
 
Java mission control and java flight recorder
Java mission control and java flight recorderJava mission control and java flight recorder
Java mission control and java flight recorder
 
Automated testing of JavaFX UI components
Automated testing of JavaFX UI componentsAutomated testing of JavaFX UI components
Automated testing of JavaFX UI components
 
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_vollJava magazin9 2012_wls 12c_das_dutzend_ist_voll
Java magazin9 2012_wls 12c_das_dutzend_ist_voll
 
JavaFX goes open source
JavaFX goes open sourceJavaFX goes open source
JavaFX goes open source
 
JDK 8 and JDK 8 Updates in OpenJDK
JDK 8 and JDK 8 Updates in OpenJDKJDK 8 and JDK 8 Updates in OpenJDK
JDK 8 and JDK 8 Updates in OpenJDK
 

Kürzlich hochgeladen

From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudOPEN KNOWLEDGE GmbH
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...OPEN KNOWLEDGE GmbH
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationOPEN KNOWLEDGE GmbH
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Markus Unterauer
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...DNUG e.V.
 

Kürzlich hochgeladen (6)

From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die CloudFrom Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
From Zero to still Zero: Die schönsten Fehler auf dem Weg in die Cloud
 
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
Machine Learning? Ja gerne! Aber was und wie? Eine Kurzanleitung für den erfo...
 
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data ImputationFEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
FEHLENDE DATEN? (K)EIN PROBLEM!: Die Kunst der Data Imputation
 
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (1) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
Rückwärts denken vorwärts handeln - Requirements Reverse Engineering bei Syst...
 
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
Slides (2) zu Teil 3 der Veranstaltungsreihe Anwendungsentwicklung mit Volt M...
 

Java Flight Recorder Javamagazin May 2017

  • 1. SPRING5 magazin JAVAMag Datenbankmigration mit Liquibase S. 89 Agile Produktentwicklung S. 76 Java 9 mit Projekt Jigsaw S. 12 Java | Architektur | Software-Innovation Depiano/Shutterstock.com www.javamagazin.de Deutschland €9,80 Österreich € 10,80 Schweiz sFr 19,50 Luxemburg €11,15 Ausgabe 5.2017 DerLenzistda Programminfos ab Seite 35! JavaMagazin5.2017 Java9AgileSpringDatenbankenAngularEclipseJavaScript
  • 2. javamagazin 5|2017 Java Core Flight Recorder 20 www.JAXenter.de von Wolfgang Weigend Der Java Flight Recorder bildet zusammen mit der Ma- nagementkonsole Java Mission Control ein Toolset für Java. Java Mission Control (JMC) ist ein etabliertes Werkzeug für das Monitoring, Profiling und die Diag- nose von Java-Anwendungen. Es ist im Oracle JDK ent- halten und lässt sich mit beliebigen Java-Anwendungen und Applikationsservern verwenden, von der Entwick- lung bis zum produktiven Betrieb. Als Bundle mit der HotSpot Java Virtual Machine ist JMC als Client oder als Eclipse-Version seit dem Oracle JDK 7 Update 40 verfügbar. Es basiert auf dem Eclipse RCP. Mit dem Kommando C:JAVA_HOMEbinjmc. exe wird Java Mission Control beispielsweise unter Microsoft Windows gestartet. JMC lässt sich über ein Oracle-Plug-in auch direkt in die Eclipse-IDE integrie- ren. Die auf dem System laufenden Java-Prozesse wer- den in einer Baumstruktur im JVM-Browser angezeigt, und mittels Doppelklick wird der darunter liegende MBean-Server oder der Flight Recorder ausgewählt. Der MBean-Server vom Clock Applet Viewer zeigt allgemei- ne Informationen zum Prozessor- und Heap-Verbrauch, Memory, Code, Threads, I/O, Systeminformationen und Eventtypen an (Abb. 1). Wird der Flight Recorder per Doppelklick ausgewählt, bekommt man zuerst den Hinweis, dass die kommerziellen Features nicht freige- geben sind. Seit JDK 8 Update 40 wird gefragt, ob man die kommerziellen Features zum Start des Flight Recor- ding automatisch freigeben möchte, mit dem Hinweis, dass die kommerziellen Features dem Oracle Binary Code License Agreement unterliegen [5]. Nach einer positiven Antwort wird der Flight Re- corder Wizard aktiviert und bietet die Aufnahme- dauer von beispielsweise einer Minute an. Im darauf folgenden Wizard-Dialog können die Aufzeichnungs- parameter ausgewählt werden. Sämtliche Konfigura- tionsparameter der grafischen Oberfläche lassen sich auch über die Kommandozeilenebene JDK/bin/jcmd <pid> <cmd> einstellen (Listing 1). Existierende JFR- Plug-ins gibt es für WebLogic und JavaFX. Andere Java-Programme lassen sich über die Kommandozei­ len­ebene mit dem Flight Recorder ebenfalls aufzeich- nen. Die JFR-Freigabeparameter können dauerhaft in der Konfigurationsdatei C:JAVA_HOMEbinjmc.ini für die JVM gesetzt werden: -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions=defaultrecording=true Java Flight Recorder Der Flugdatenschreiber Der Java Flight Recorder ist mit einem echten Flugdatenschreiber vergleichbar. Die auf ihm gespeicher- ten Informationen werden wichtig, wenn etwas schief gelaufen ist. Mit seiner einheitlichen Datenbasis hilft der Flight Recorder außerdem Administratoren und Entwicklern dabei, gemeinsam an Problemlö- sungen zu arbeiten und Konflikte besser und schneller bewältigen zu können. Entstehung der Werkzeuge Die ursprüngliche Entwicklung der Werkzeuge JRockit Mission Control Console, JRockit Runtime Analyzer, JRockit Memory Leak Detector und JRCMD (CLI für Diagnosekommandos) fand im JRockit Virtual Machine Team statt. Unter BEA Systems wurde der Runtime Analyzer durch den JRockit Flight Recor- der ersetzt. Mit der Firmenübernahme von BEA Systems und Sun Microsystems durch Oracle wurde Java Mission Control (JMC) und Java Flight Recorder (JFR) für die HotSpot JVM im Oracle JDK 7 Update 40 weiterentwickelt. Es ist mit der Ver- sion JMC und JFR 5.5, basierend auf Eclipse 4.4, im Oracle JDK 8 enthalten [1] und für die Betriebssysteme Microsoft Windows, Linux und Mac OS X zertifiziert [2]. JMC und JFR sind als eingebundene Werkzeuge mit Java SE Advanced Support paketiert [3], [4], sodass sie nur über einen expliziten Java- SE-Advanced-Support-Vertrag kommerziell verwendet werden dürfen. Die kostenfreie Verwendung von JMC und JFR ist nur zum Selbststudium oder zur privaten Eigenentwicklung erlaubt. JMC ermöglicht das direkte JVM-Online-Monitoring mittels JMX und visualisiert die vom JFR gesammelten Daten. JFR übernimmt die Offline-Profiling- und Diagnosefunktion während des gesamten Applikationslebenszyklus, von der Anwendungsentwicklung über Test, Integration bis zum Anwendungsbetrieb mit einer kontinu- ierlichen Optimierung.
  • 3. javamagazin 5 |2017 Java CoreFlight Recorder 21www.JAXenter.de Architektur des Java Flight Recorders Der Java Flight Recorder ist ein Event Recorder, der direkt mit der Java Virtual Machine (JVM) verzahnt ist und alle verfügbaren JVM-Laufzeitparameter lie- fert [6]. Die Messung zeigt das tatsächliche Verhalten der eingeschalteten JVM-Optimierungsparameter. Die Aufzeichnung erfolgt in einem kompakten Binärfor- mat, das alle notwendigen Informationen zur späteren Analyse und Diagnose enthält. Das proprietäre Binär- format ist für schnelles Schreiben und Lesen ausgelegt und lässt sich komprimieren. Der Mehraufwand für die Aufzeichnung beträgt rund drei Prozent einer be- stehenden Anwendungsinfrastruktur. Der Einsatz vom JFR wurde für den dauerhaften Betrieb konzipiert, eine JFR-Datei lässt sich jederzeit erzeugen. Kontinuierli- che Aufnahmen haben kein definiertes Ende, und man muss eine JFR-Datei über dumponexit=true explizit er- zeugen. Es lassen sich aber auch zeitlich fest definierte Aufnahmen durchführen. Der Flight Recorder sammelt über Events sowohl die Informationen der JVM durch interne APIs als auch die Daten der darauf laufenden Java-Anwendung über das Java-API. Die erzeugten Daten werden in kleine lokale Threadbuffer gespeichert. Nach dem Erreichen der ma- ximalen Threadbufferkapazität werden sie in globale In-Memory-Buffer kopiert und schließlich auf die Fest- platte geschrieben. Dabei gibt es keine überlappenden Informationen der Threadbuffer und Globalbuffer, so- dass sich ein betreffendes Datensegment entweder noch im Speicherbereich der Bufferstruktur befindet oder be- reits auf die Festplatte gespeichert worden ist (Abb. 2). Durch die gleichzeitige Aufnahme von Java-Anwen- dungsinformationen und den JVM-Informationen, wie Class Loading, Code-Cache-Compiler, Garbage Col­ Abb. 1: Beim Start zeigt der MBean-Server vom Clock Applet Viewer allgemeine Informationen an, z. B. zum Prozessor- und Heap-Verbrauch, Memory oder Threads Listing 1: Kommandozeilenbeispiel „jcmd“ mit Flight Recording für Clock Applet C:>jcmd 1936 7108 sun.plugin2.main.client.PluginMain read_pipe_name=jpi2_pid1936_pipe1, write_pipe_name=jpi2_pid1936_pipe2 4264 7512 sun.tools.jcmd.JCmd C:jcmd 7108 help 7108: The following commands are available: JFR.stop JFR.start JFR.dump JFR.check VM.check_commercial_features VM.unlock_commercial_features .. For more information about a specific command use 'help command'. C:jcmd 7108 VM.unlock_commercial_features 7108: Commercial Features now unlocked. C:jcmd 7108 JFR.start name=MyRecording settings=profile delay=20s duration=2m filename=c:tempmyrecording.jfr 7108: Recording 3 scheduled to start in 20 s. The result will be written to: C:tempmyrecording.jfr
  • 4. javamagazin 5|2017 Java Core Flight Recorder 22 www.JAXenter.de lec­tor und Laufzeitumgebung, bekommt man eine ein- heitliche Sicht zur fokussierten Analyse und Diagnose. Aus der JMC-Konsole lässt sich über Create a new connection die Remote-Verbindung zu einer entfern- ten JVM herstellen, unter Angabe von Hostnamen, Port und Benutzer mit Passwort. JFR-Aufzeichnungsbeispiele und Analyse Es gibt zwei Arten von Aufzeichnungen. Die erste Va- riante besteht aus kontinuierlichen JFR-Aufnahmen ohne definiertes Ende. Man muss durch ein explizites Dump-Kommando oder mit dem Diagnostic-Komman- do JFR.dump das laufende Flight Recording beenden. Dabei können die letzten Minuten vor einem Fehler ausgegeben werden. Die zweite Aufzeichnungsvariante besitzt eine feste Aufnahmezeit und wird als Profiling Recording bezeichnet. Falls diese aus der Java Mission Control Console gestartet wurde, wird die grafische Oberfläche automatisch mit der aufgezeichneten JFR- Datei geöffnet. Diese Variante wird bei Performance- und Lasttests empfohlen, um beispielsweise 30 Minuten aufzuzeichnen. Zum besseren Analyseverständnis ist es notwendig, die Anwendung zu kennen und zu wissen, ob hoher Durchsatz oder niedrige Latenzzeiten im Vor- dergrund stehen, oder wie hoch der Prozessorverbrauch tatsächlich sein soll. Zur Flight-Recording-Analyse be- Abb. 2: Die Architektur des Java Flight Recordes Problem Lösung Lock contention + Monitor enter events Excessive class loading + Class loading events Expenses of redundant exception logging + Through method profiling information and lock contention information Context switches + Through context switch rate events Processor burn rate + Method profiling events GC thrashing + All the various GC events Tabelle 1: Beispielszenarien zur Diagnose interner JVM-Information mit JMC/JFR 5.5 Listing 2: Codebeispiel „02_JFR_HotMethods HotMethods.java“ import java.io.IOException; import com.oracle.jrockit.jfr.EventToken; import com.oracle.jrockit.jfr.InstantEvent; import com.oracle.jrockit.jfr.Producer; public class HotMethods { // Hint: You may want to set NUMBER_OF_THREADS // close to the number of hardware threads for // maximum saturation private static final int NUMBER_OF_THREADS = 4; private static final String PRODUCER_URI = http:// www.oracle.com/jmc/tutorial/example2; static final Producer PRODUCER; static final EventToken WORK_EVENT_TOKEN; static { PRODUCER = createProducer(); WORK_EVENT_TOKEN = createToken(WorkEvent. class); PRODUCER.register(); } /** * Creates our event token. */ public static EventToken createToken(Class? extends InstantEvent clazz) { try { return PRODUCER.addEvent(clazz); } catch (Exception e) { // Add proper exception handling. e.printStackTrace(); } return null; } /** * Creates our producer. */ private static Producer createProducer() { try { return new Producer(Tutorial Example 2, A demo event producer for the HotMethods Example., PRODUCER_URI); } catch (Exception e) { // Add proper exception handling. e.printStackTrace(); } return null; } public static void main(String[] args) throws IOException { Thread[] threads = new Thread[NUMBER_OF_ THREADS]; for (int i = 0; i threads.length; i++ ) { threads[i] = new Thread(new Worker(), Worker Thread + i); threads[i].setDaemon(true); threads[i].start(); } System.out.print(Press enter to quit!); System.out.flush(); System.in.read(); } }
  • 6. javamagazin 5|2017 Java Core Flight Recorder 24 www.JAXenter.de nötigt man ein gewisses Maß an Erfahrung und Übung im Umgang mit den Werkzeugen (Tabelle 1). Die prak- tischen Übungen aus dem Java Mission Control Tuto- rial [7] von Marcus Hirt [8] verdeutlichen den Umgang mit dem Java Flight Recorder. Lässt man das Beispiel 02_JFR_HotMethods mit Eclipse laufen (Listing  2) und startet den Flight Re- corder, erkennt man in der Aufzeichnung flight_ recording_18045HotMethods3224.jfr (Abb.  3), dass viel Zeit in der Methode LinkedList.indexOf(Object) verbracht wird. Schaut man sich die Aufzeichnung in der JMC-Konsole unter dem Menüpunkt Code und Hot Methods an, erkennt man, dass die Methode contains durchlaufen wird. contains verhält sich in ei- ner LinkedList proportional zur Anzahl der Einträge. Durch ein HashSet könnte dies in kürzerer Zeit ablau- fen. Mit einem Blick auf die JMC-Konsole unter dem Menüpunkt Code und der Ansicht Call Tree kann man herausfinden, wo contains aufgerufen wird. Folgt man im Stack Trace dem größten Ressourcenver- brauch von 99,85 Prozent bei java.lang.Thread.run(), gelangt man zu java.util.LinkedList.indexOf(Object) mit einem hohen Ressourcenverbrauch von 99,37 Pro- zent. Ersetzt man im Programmcode Initiator.java (Lis- ting 3) die Zeile collection = new LinkedListInteger(); mit collection = new HashSetInteger();, läuft das Programmbeispiel JFR_HotMethods viel schneller und spart Ressourcen, wie in der Aufzeichnung flight_ recording_18045HotMethods948.jfr in Abbildung  4 dargestellt. Das nächste Codebeispiel verdeutlicht das Allokati- onsverhalten, hervorgerufen durch eine ungünstige Aus- wahl von Datentypen. Wird das Beispiel 04_JFR_GC mit dem Programm Allocator.java (Listing  4) in der Listing 3: Codebeispiel „02_JFR_­HotMethods Initiator.java“ import java.util.*; public class Initiator { private CollectionInteger collection; public Initiator() { collection = new LinkedListInteger(); // collection = new HashSetInteger(); } // Hint: This creates a list of unique // elements! public void initiate(int seed) { collection.clear(); for (int i = 1; i 10000; i++) { if ((i % seed) != 0) collection.add(i); } } protected CollectionInteger getCollection() { return collection; } public int countIntersection(Initiator other) { int count = 0; for (Integer i : collection) { if (other.getCollection().contains(i)) { count++; } } return count; } } Abb. 3: Die JMC-Call-Tree-Ansicht für „flight_recording_18045HotMethods3224.jfr“ zeigt, dass viel Zeit in der Methode „LinkedList. indexOf(Object)“ verbracht wird
  • 8. javamagazin 5|2017 Java Core Flight Recorder 26 www.JAXenter.de Eclipse-IDE gestartet und aktiviert man den Flight Re- corder, erkennt man in der JMC-Konsole unter dem Menüpunkt Memory und Garbage Collection ei- nen extrem breiten ansteigenden Sägezahnverlauf in der Aufzeichnung flight_recording_18045Allocator6764. jfr (Abb.  5), der den Used-Heap-Verbrauch mit ca. 22 MB zeigt. Nun stellt sich die Frage, welche Objek- te am häufigsten allokiert werden. Es sind reichlich Integer-Allokationen vorhanden. Daraus ergibt sich die nächste Frage: Was hat die Allokationen und die Gar- bage Collections verursacht? Die JMC-Console-Ansicht Code, Call Tree und Stack Trace mit java.util. HashMap$ValueIterator.next() lässt erahnen, dass die Allokationen durch CollectionMyAlloc myAllocSet = map.values(); verursacht worden sein könnten, weil Allocator ständig den Primitive Type int zum Object Type Integer umgewandelt hat, siehe auch Codezeile if (!map.containsKey(c.getId())) in Listing 4. Falls Primi­ tive Types als Index in HashMaps verwendet werden, ist es besser, die Object-Type-Version zu speichern als stän- dig zwischen dem Primitive Type int und dem Object Type Integer hin und her zu wechseln. Ersetzt man jeden Primitive Type int mit dem Object oder Reference Type Integer in der Klasse MyAlloc, reduziert sich die Anzahl der Garbage Collections erheblich. Nach der Codeän- derung in Allocator.java (Listing 5) zeigt die Aufzeich- nung flight_recording_18045Allocator1432.jfr (Abb. 6) den ansteigenden Sägezahnverlauf, aber ohne die zuvor Abb. 4: Nach der Codeänderung ist das Programm schneller und spart Ressourcen, wie die Call-Tree-Ansicht für „flight_ recording_18045HotMethods948.jfr“ zeigt Listing 4: Codebeispiel „04_JFR_GC ­Allocator.java“ mit „int“ und „Integer“ import java.util.Collection; import java.util.HashMap; public class Allocator { private HashMapInteger, MyAlloc map = new HashMapInteger, MyAlloc(); private static class MyAlloc { private int id; private MyAlloc(int id) { this.id = id; } private int getId() { return id; } } public static void main(String[] args) { new Allocator().go(); } private void go() { alloc(10000); long yieldCounter = 0; while(true) { CollectionMyAlloc myAllocSet = map.values(); for (MyAlloc c : myAllocSet ) { if (!map.containsKey(c.getId())) System.out.println(Now this is strange!); if (++yieldCounter % 1000 == 0) Thread.yield(); } } } private void alloc(int count) { for (int i = 0; i count; i++) { map.put(i, new MyAlloc(i)); } } }
  • 9. javamagazin 5 |2017 Java CoreFlight Recorder 27www.JAXenter.de sichtbare breite Verzerrung, und der Used-Heap-Ver- brauch hat sich auf rund 8 MB verringert. Fazit und Ausblick Die Verwendung der Werkzeuge Java Mission Con- trol und Java Flight Recorder bringt einige Vorteile, weil man schneller und strukturiert potenzielle Feh- ler erkennt. Aufgrund der gemeinsamen Datenbasis mit JFR-Dateien können Entwickler, Administratoren und Supportmitarbeiter während des gesamten Appli- kationslebenszyklus besser zusammenarbeiten, ohne lästiges Verschieben von Zuständigkeiten oder abge- grenzten Verantwortungsbereichen. Voraussetzung für ein erfolgreiches Zusammenspiel der unterschiedlichen Abb. 5: Die Garbage-Collections-Ansicht für „flight_recording_18045Allocator6764.jfr“ zeigt einen steilen Sägezahnanstieg IT-Rollen ist, dass jeder in seinem Gebiet genügend Er- fahrungen mit den eingesetzten Unternehmensanwen- dungen inklusive den passenden Werkzeugen sammeln kann und sich strukturiert mit seinen Kollegen austau- schen kann. Mit der zunehmenden Komplexität der Anwendungslandschaft wächst auch die Werkzeugaus- stattung von Entwicklern und Administratoren in den Unternehmen. Dass die Werkzeuge Bestandteil vom Oracle-Java-SE-Advanced-Support sind [3], ist oft eine Hürde. Die Unternehmen, die sich einer notwendigen Java-Werkzeugausstattung für ihre IT-Umgebung be- wusst sind, wählen zwischen Third-Party-Werkzeugen und den JMC-/JFR-Werkzeugen aus und haben auch ein Budget dafür eingeplant. Im anderen Fall versuchen Un- Listing 5: Codebeispiel „04_JFR_GC ­Allocator.java“ mit Integer import java.util.Collection; import java.util.HashMap; public class Allocator { private HashMapInteger, MyAlloc map = new HashMapInteger, MyAlloc(); private static class MyAlloc { private Integer id; private MyAlloc(Integer id) { this.id = id; } private Integer getId() { return id; } } public static void main(String[] args) { new Allocator().go(); } private void go() { alloc(10000); long yieldCounter = 0; while(true) { CollectionMyAlloc myAllocSet = map.values(); for (MyAlloc c : myAllocSet ) { if (!map.containsKey(c.getId())) System.out.println(Now this is strange!); if (++yieldCounter % 1000 == 0) Thread.yield(); } } } private void alloc(Integer count) { for (Integer i = 0; i count; i++) { map.put(i, new MyAlloc(i)); } } }
  • 10. javamagazin 5|2017 Java Core Flight Recorder 28 www.JAXenter.de ternehmen ohne Werkzeugbeschaffung auszukommen oder jeweils die einzelnen Entwickler und Administra- toren in die Pflicht zu nehmen, oft mit positiven Effek- ten beim Einsatz von Open-Source-Werkzeugen. Aber auch mit den damit verbundenen Mehraufwendungen bei fehlenden Merkmalen oder kritischen Problemfäl- len, falls Performanceexperten als Feuerwehr ad hoc in die Unternehmen kommen müssen. In jedem Fall sind Kosten zu berücksichtigen, einerseits für die nötigen Werkzeuge und andererseits für Consulting. Hinter den Werkzeugen Java Mission Control und Java Flight Recorder steht ein Entwicklungsteam, das größtenteils in Stockholm arbeitet und die Werkzeuge kontinuierlich weiterentwickelt. Die Roadmap sieht für JMC 6.0 mit JDK 9 eine automatische Analyse der Flight Recordings vor, und die Benutzeroberfläche soll modernisiert werden. Außerdem sollen neue Eventtypen kommen: • Detaillierte Safe-Point-Informationen • Detaillierte Code-Cache-Informationen • Compilerevents mit detaillierten Inlining-Informati- onen • Garbage-First-Informationen mit verbesserter Zu- standsvisualisierung der Memory-Regionen • Modulevents für geladene Module • Unterstützung von nativen geladenen Bibliotheken mit periodischen Events Zu den Verbesserungen zählen auch neue APIs, die bei der Verwendung von Custom-Events unterstützen. Der programmatische Zugriff zum Lesen von Flight Recor- dings und zur Kontrolle vom Flight Recorder sowie die Modularisierungsunterstützung mit kleineren Profilen Abb. 6: „flight_recording_18045Allocator1432.jfr“ zeigt den Sägezahnverlauf, aber ohne Verzerrungen, und der Used Heap hat sich verringert werden einfacher zu benutzen sein. Zudem wird der Namespace von oracle.jrockit.* nach jdk.jfr.* geändert. Letztlich steht der JMC-JFR-Memory-Leak-Detektor un- ter Vorbehalt auf der Wunschliste für die Roadmap. Die geplante Auslieferung von JMC 6.0 ist mit der JDK-9-­ Releasefreigabe [9] für den 27. Juli 2017 vorgesehen. Wolfgang Weigend arbeitet als Sen. Leitender Systemberater bei der Oracle Deutschland B.V. Co. KG. Er beschäftigt sich mit ­Java-Technologie und Architektur für unternehmensweite Anwen- dungsentwicklung. Links Literatur [1] Java Mission Control 5.5 Release Notes: http://www.oracle.com/ technetwork/java/javase/jmc55-release-notes-2412446.html [2] Oracle Java Mission Control 5.5 Certified System Configurations: http:// www.oracle.com/technetwork/java/javaseproducts/documentation/jmc- 5-5-certified-system-config-2432060.html [3] Java Components: https://docs.oracle.com/javacomponents/index.html [4] Oracle Java SE and Oracle Java Embedded Products: http://www.oracle. com/technetwork/java/javase/terms/products/index.html [5] Oracle Binary Code License Agreement for the Java SE Platform Products and JavaFX: http://www.oracle.com/technetwork/java/javase/terms/ license/index.html [6] Java Platform, Standard Edition Java Flight Recorder Runtime Guide: https://docs.oracle.com/javacomponents/jmc-5-5/jfr-runtime-guide/ toc.htm [7] JMC Tutorial: http://hirt.se/downloads/oracle/jmc_tutorial.zip [8] Blog von Marcus Hirt: http://hirt.se/blog/ [9] JDK 9: http://openjdk.java.net/projects/jdk9/
  • 11. www.entwickler.de Java-Magazin-Abonnement abschließen auf www.entwickler.de Jetzt abonnieren und 3 TOP-VORTEILE sichern! Im entwickler.kiosk immer und überall online lesen – am Desktop und mobil Mit vergünstigtem Upgrade auf das gesamte Angebot im entwickler.kiosk zugreifen Alle Printausgaben frei Haus erhalten