Slide 1

Slide 1 text

Endlich! Mission Control und Flight Recorder für Hotspot

Slide 2

Slide 2 text

Es war einmal…

Slide 3

Slide 3 text

Es war einmal…

Slide 4

Slide 4 text

Es war einmal…

Slide 5

Slide 5 text

HotRockit Mark Reinhold, 2010

Slide 6

Slide 6 text

Mission Control Marcus Hirt, Java One 2011

Slide 7

Slide 7 text

Mission Control Marcus Hirt, Java One 2013

Slide 8

Slide 8 text

Release! • Java 7u40 • Mission Control 5.2

Slide 9

Slide 9 text

Release! • Java 7u40 • Mission Control 1.0 for HotSpot

Slide 10

Slide 10 text

MISSION CONTROL

Slide 11

Slide 11 text

Mission Control

Slide 12

Slide 12 text

MISSION CONTROL DEMO

Slide 13

Slide 13 text

Gemeinsamkeiten • Verbindet sich zu VMs via JMX • Dashboards – Speicherverbrauch – JVM Umgebungsvariablen • Pluginunterstützung – JMX MBean Überwachung

Slide 14

Slide 14 text

Unterschiede Kirk Pepperdine, Oktober 2013

Slide 15

Slide 15 text

Plugins

Slide 16

Slide 16 text

JOVERFLOW DEMO

Slide 17

Slide 17 text

Java Discovery Protocol http://openjdk.java.net/jeps/168 -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.rmi.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.autodiscovery=true -Dcom.sun.management.jdp.name=JVM_Name

Slide 18

Slide 18 text

FLIGHT RECORDER

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Permanentes Profiling • JVMTI Profiler – JProfiler – Yourkit – weitere • Teure Datensammlung • Teure Datenhaltung Vereinfachte Darstellung

Slide 23

Slide 23 text

APM Tools • Javaagent Profiler – AppDynamics – Dynatrace – New Relic • Transaktionsbasierte Datensammlung • Geringerer Overhead • Weniger Details als Profiler Vereinfachte Darstellung

Slide 24

Slide 24 text

Flight Recorder • Neues, natives Profilinginterface • Datensammlung im nativen Speicher • Persistiert in Datei

Slide 25

Slide 25 text

Oracle != Sun • Sun bot offene Interfaces für Drittanbieter an – JVMPI/JVMTI – Javaagent – JSR 163 • HProf war eine "Beispielimplementierung" • Viel Wettbewerb auf dem Markt von Profilern und Monitoring Tools • Flight Recorder ist proprietär

Slide 26

Slide 26 text

Neue Technik • In HotSpot integriert • +UnlockCommercialFeatures • +UseFlightRecorder • Geringer Overhead • Keine Threadkooperation via Safepoints notwendig

Slide 27

Slide 27 text

Keine Safepoints • JVMTI bietet Safepoint Profiling • Threads müssen stoppen / kooperieren • Höherer Overhead • Versatz

Slide 28

Slide 28 text

Java 6u25 CPU SAMPLES BEGIN (total = 4473) Tue Oct 29 08:30:35 2013 rank self accum count trace method 1 85.38% 85.38% 3819 300036 java.util.ArrayList.add 2 4.58% 89.96% 205 300035 java.util.ArrayList.ensureCapacity 3 4.56% 94.52% 204 300136 java.lang.AbstractStringBuilder. 4 3.40% 97.92% 152 300137 java.util.Arrays.copyOfRange 5 1.25% 99.17% 56 300148 java.lang.Integer.getChars 6 0.11% 99.28% 5 300037 de.cc.training.cpu.finder.PrimeFinder1.isPrime 7 0.11% 99.40% 5 300140 java.lang.Integer.toString 8 0.11% 99.51% 5 300033 de.cc.training.cpu.finder.PrimeFinder1.findPrimes 9 0.09% 99.60% 4 300144 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 10 0.07% 99.66% 3 300145 java.lang.Integer.intValue 11 0.07% 99.73% 3 300141 java.lang.System.arraycopy 12 0.04% 99.78% 2 300146 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 13 0.02% 99.80% 1 300149 java.lang.Long.valueOf 14 0.02% 99.82% 1 300069 java.io.WinNTFileSystem.canonicalize0 15 0.02% 99.84% 1 300142 java.lang.Integer.toString CPU SAMPLES END

Slide 29

Slide 29 text

Java 7u40 CPU SAMPLES BEGIN (total = 387) Tue Oct 29 08:29:38 2013 rank self accum count trace method 1 35.92% 35.92% 139 300137 java.lang.AbstractStringBuilder. 2 22.48% 58.40% 87 300144 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 3 17.57% 75.97% 68 300145 java.lang.Integer.getChars 4 11.89% 87.86% 46 300133 java.util.Arrays.copyOfRange 5 3.62% 91.47% 14 300136 java.lang.System.arraycopy 6 1.81% 93.28% 7 300052 java.util.ArrayList.grow 7 1.29% 94.57% 5 300050 de.cc.training.cpu.finder.PrimeFinder1.findPrimes 8 1.29% 95.87% 5 300141 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 9 0.78% 96.64% 3 300138 java.lang.Integer.toString 10 0.52% 97.16% 2 300140 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 11 0.52% 97.67% 2 300143 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 12 0.26% 97.93% 1 300142 de.cc.training.cpu.consumer.PrimeConsumer1.consumePrimes 13 0.26% 98.19% 1 300139 java.lang.StringBuilder. 14 0.26% 98.45% 1 300053 java.lang.Integer.valueOf 15 0.26% 98.71% 1 300134 java.lang.System.arraycopy CPU SAMPLES END

Slide 30

Slide 30 text

http://www-plan.cs.colorado.edu/klipto/ http://bryanpendleton.blogspot.de/2010/08/improving-accuracy-of-java- profilers.html

Slide 31

Slide 31 text

FLIGHT RECORDER Demo

Slide 32

Slide 32 text

Startup -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:FlightRecorderOptions= defaultrecording=true, disk=true, repository=/flightRecorder, maxage=15m, dumponexit=true

Slide 33

Slide 33 text

Aufnahmen • "Continuous" • "Profiling" • Angeblich produktionsfähig • Beliebig aus Events konfigurierbar

Slide 34

Slide 34 text

Events • 4 Typen von Events – Instant – Requestable – Duration – Timed

Slide 35

Slide 35 text

EIGENE EVENTS Demo

Slide 36

Slide 36 text

@EventDefinition(path = "primes/found", name = "Prime Found", description = "", stacktrace = true, thread = true) public class PrimeFoundEvent extends InstantEvent { @ValueDefinition(name = "Prime", description = "", contentType = ContentType.None) private int prime; public PrimeFoundEvent(EventToken eventToken) { super(eventToken); } public int getPrime() { return prime; } public void setPrime(int prime) { this.prime = prime; } }

Slide 37

Slide 37 text

public class FlightRecorderEventHelper { private final static String PRODUCER_URI = "http://www.codecentric.de/"; private static final Producer PRODUCER; private static final EventToken EVENT_TOKEN; static { PRODUCER = createProducer(); EVENT_TOKEN = createToken(); PRODUCER.register(); } private static Producer createProducer() { return new Producer("Prime Found Producer", "", PRODUCER_URI); } private static EventToken createToken() { return PRODUCER.addEvent(PrimeFoundEvent.class); } private static PrimeFoundEvent event = new PrimeFoundEvent(EVENT_TOKEN); public static void createEvent(int prime) { event.reset(); event.setPrime(prime); event.commit(); }

Slide 38

Slide 38 text

Her damit! • -XX:+UnlockCommercialFeatures • Eine "Lizenz" pro Produktionssystem. – Pro Prozessor. 5k USD / 15k USD – Intel: Halber Preis • Für Entwicklung und Test gratis • Im Vergleich: – JProfiler pro Entwickler < 500 USD – AppDynamics pro JVM < 3000 USD

Slide 39

Slide 39 text

Was ist Flight Recorder • Kein APM Tool – Keine zentrale Datenspeicherung – Keine Alarmierung • Kein Profiler – Profiler Lizenz pro Developer

Slide 40

Slide 40 text

Fazit • Das Tool ist gut • Das Tool ist teuer • Die API nicht zu öffnen ist böse

Slide 41

Slide 41 text

@CodingFabian speakerdeck.com/CodingFabian blog.codecentric.de Java 7u40 hirt.se/blog infoq.com