{"id":699,"date":"2026-06-22T23:33:06","date_gmt":"2026-06-22T22:33:06","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=699"},"modified":"2026-07-07T23:33:38","modified_gmt":"2026-07-07T22:33:38","slug":"java-flight-recorder-jdk-mission-control-performance-probleme-systematisch-aufspueren","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=699","title":{"rendered":"Java Flight Recorder &amp; JDK Mission Control \u2013 Performance-Probleme systematisch aufsp\u00fcren"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Deine JVM-Anwendung l\u00e4uft langsam, aber du hast keinen Profiler? Oder schlimmer: Sie l\u00e4uft produktiv, und jeder externe Profiler w\u00fcrde sie unbrauchbar verlangsamen? Genau daf\u00fcr wurde Java Flight Recorder (JFR) entwickelt \u2014 ein in die JVM integrierter, kontinuierlicher Profiler mit weniger als 1% Overhead.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dieser Artikel zeigt, wie du JFR einsetzt, eigene Events definierst und mit JDK Mission Control analysierst.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Was ist JFR?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JFR ist ein ereignisbasiertes Profiling-Framework, das seit JDK 11 in OpenJDK enthalten ist (vorher kommerziell). Es zeichnet Hunderte von Event-Typen auf: GC-Pausen, Thread-Aktivit\u00e4t, Lock-Konflikte, I\/O, Allokation, Exceptions und vieles mehr.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zwei Modi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kontinuierliche Aufzeichnung<\/strong>\u00a0mit Ringpuffer \u2014 wie eine Dashcam; im Problemfall rufst du die letzte Stunde ab<\/li>\n\n\n\n<li><strong>Gezielte Aufzeichnung<\/strong>\u00a0mit Profil-Einstellungen \u2014 detailliertere Events, etwas mehr Overhead (~2%)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">JFR aus der Kommandozeile starten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Der einfachste Einstieg:&nbsp;<code>-XX:StartFlightRecording<\/code>&nbsp;beim JVM-Start:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># 60 Sekunden aufzeichnen, Datei beim Beenden schreiben<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\njava -XX:StartFlightRecording:filename=meine-app.jfr,duration=60s \\\n     -jar meine-app.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr Produktion empfiehlt sich die kontinuierliche Aufzeichnung mit Ringpuffer:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">java \\\n  -XX:StartFlightRecording:name=production,maxage=<span class=\"hljs-number\">1<\/span>h,maxsize=<span class=\"hljs-number\">500<\/span>MB,settings=<span class=\"hljs-keyword\">default<\/span> \\\n  -jar meine-app.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Tritt ein Problem auf, dumpst du den aktuellen Puffer ohne Neustart:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">jcmd <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PID<\/span>&gt;<\/span> JFR.dump name=production filename=problem.jfr\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><code>jcmd<\/code>&nbsp;erlaubt vollst\u00e4ndige Laufzeit-Kontrolle:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">jcmd <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PID<\/span>&gt;<\/span> JFR.start name=debug settings=profile duration=120s filename=debug.jfr\njcmd <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PID<\/span>&gt;<\/span> JFR.check           <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Laufende Aufzeichnungen anzeigen<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\njcmd <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">PID<\/span>&gt;<\/span> JFR.stop name=debug <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Aufzeichnung beenden<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Die wichtigsten Event-Typen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JFR hat \u00fcber 200 Event-Typen. Hier die essenziellen f\u00fcr die Performance-Analyse:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">Kategorie<\/th><th class=\"has-text-align-left\" data-align=\"left\">Event<\/th><th class=\"has-text-align-left\" data-align=\"left\">Was es zeigt<\/th><\/tr><\/thead><tbody><tr><td>CPU<\/td><td><code>jdk.ExecutionSample<\/code><\/td><td>Methoden-Stacktraces in Intervallen \u2014 dein CPU-Profiler<\/td><\/tr><tr><td>Allocation<\/td><td><code>jdk.ObjectAllocationSample<\/code><\/td><td>Welche Objekte wo alloziert werden (Sampling-basiert)<\/td><\/tr><tr><td>GC<\/td><td><code>jdk.GarbageCollection<\/code><\/td><td>Jede GC mit Dauer und Speicher vor\/nachher<\/td><\/tr><tr><td>Threads<\/td><td><code>jdk.JavaMonitorEnter<\/code><\/td><td>Threads, die auf Locks warten<\/td><\/tr><tr><td>Threads<\/td><td><code>jdk.VirtualThreadPinned<\/code><\/td><td>Virtual Thread am Carrier gepinnt \u2014 kritisch f\u00fcr Loom-Debugging<\/td><\/tr><tr><td>I\/O<\/td><td><code>jdk.FileRead<\/code>,&nbsp;<code>jdk.SocketRead<\/code><\/td><td>Datei- und Netzwerk-I\/O mit Dauer und Bytes<\/td><\/tr><tr><td>Exceptions<\/td><td><code>jdk.ExceptionStatistics<\/code><\/td><td>Exception-Z\u00e4hler \u2014 versteckte Performance-Killer<\/td><\/tr><tr><td>System<\/td><td><code>jdk.CPULoad<\/code><\/td><td>JVM + Maschinen-CPU-Auslastung<\/td><\/tr><tr><td>Container<\/td><td><code>jdk.ContainerCPUThrottling<\/code><\/td><td>Container-CPU-Throttling-Ereignisse<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Eigene JFR-Events definieren<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das programmierbare API (<code>jdk.jfr<\/code>) erlaubt eigene Events mit minimalem Code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> jdk.jfr.*;\n\n@Name(<span class=\"hljs-string\">\"shop.BestellungAufgegeben\"<\/span>)\n@Label(<span class=\"hljs-string\">\"Bestellung aufgegeben\"<\/span>)\n@Category({<span class=\"hljs-string\">\"Shop\"<\/span>, <span class=\"hljs-string\">\"Bestellungen\"<\/span>})\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">BestellungEvent<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Event<\/span> <\/span>{\n    @Label(<span class=\"hljs-string\">\"Bestellnummer\"<\/span>)\n    <span class=\"hljs-built_in\">String<\/span> bestellnummer;\n\n    @Label(<span class=\"hljs-string\">\"Einzelposten\"<\/span>)\n    int posten;\n\n    @Label(<span class=\"hljs-string\">\"Gesamtbetrag\"<\/span>)\n    double betrag;\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Nutzung im Code:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">BestellungEvent event = <span class=\"hljs-keyword\">new<\/span> BestellungEvent();\nevent.bestellnummer = <span class=\"hljs-string\">\"BO-2026-0042\"<\/span>;\nevent.posten = <span class=\"hljs-number\">3<\/span>;\nevent.betrag = <span class=\"hljs-number\">149.97<\/span>;\nevent.commit();  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ Instant-Event: sofort weggeschrieben<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">F\u00fcr die Messung von Laufzeiten (Duration-Event):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">@Name(<span class=\"hljs-string\">\"shop.PreisBerechnung\"<\/span>)\n@Label(<span class=\"hljs-string\">\"Preisberechnung\"<\/span>)\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">PreisBerechnungEvent<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Event<\/span> <\/span>{}\n\n&lt;em&gt;<span class=\"hljs-comment\">\/\/ Nutzung:&lt;\/em&gt;<\/span>\nPreisBerechnungEvent event = <span class=\"hljs-keyword\">new<\/span> PreisBerechnungEvent();\nevent.begin();\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ ... teure Berechnung ...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\nevent.commit();  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ commit() impliziert end(); Duration automatisch gesetzt<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\"><strong>Performance-Tipp:<\/strong>&nbsp;Baue Payload nur, wenn das Event auch aktiviert ist:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">BestellungEvent event = <span class=\"hljs-keyword\">new<\/span> BestellungEvent();\nevent.begin();\n<span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ ... Operation ...<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n<span class=\"hljs-keyword\">if<\/span> (event.shouldCommit()) {\n    event.bestellnummer = bestellnummer;  <span class=\"xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span>\/\/ teure Konstruktion nur wenn n\u00f6tig<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span><\/span>\n    event.commit();\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">JFR-Streaming: Echtzeit-Alerting<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Seit JDK 14 kann man JFR-Events als Stream abonnieren \u2014 ideal f\u00fcr Alerts auf GC-Pausen oder hohe CPU-Last:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> jdk.jfr.consumer.RecordingStream;\n<span class=\"hljs-keyword\">import<\/span> java.time.Duration;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JfrMonitor<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        <span class=\"hljs-keyword\">try<\/span> (<span class=\"hljs-keyword\">var<\/span> stream = <span class=\"hljs-keyword\">new<\/span> RecordingStream()) {\n            stream.enable(<span class=\"hljs-string\">\"jdk.GarbageCollection\"<\/span>);\n            stream.enable(<span class=\"hljs-string\">\"jdk.CPULoad\"<\/span>);\n\n            stream.onEvent(<span class=\"hljs-string\">\"jdk.GarbageCollection\"<\/span>, event -&gt; {\n                long pauseMs = event.getDuration().toMillis();\n                <span class=\"hljs-keyword\">if<\/span> (pauseMs &gt; <span class=\"hljs-number\">100<\/span>) {\n                    System.out.printf(<span class=\"hljs-string\">\"\u26a0\ufe0f Lange GC-Pause: %dms%n\"<\/span>, pauseMs);\n                }\n            });\n\n            stream.onEvent(<span class=\"hljs-string\">\"jdk.CPULoad\"<\/span>, event -&gt; {\n                float jvmCpu = event.getFloat(<span class=\"hljs-string\">\"jvmUser\"<\/span>);\n                float machineCpu = event.getFloat(<span class=\"hljs-string\">\"machineTotal\"<\/span>);\n                <span class=\"hljs-keyword\">if<\/span> (machineCpu &gt; <span class=\"hljs-number\">0.90<\/span>f) {\n                    System.out.printf(<span class=\"hljs-string\">\"\u26a0\ufe0f Hohe System-CPU: %.1f%%%n\"<\/span>,\n                        machineCpu * <span class=\"hljs-number\">100<\/span>);\n                }\n            });\n\n            stream.startAsync();\n            Thread.sleep(Duration.ofHours(<span class=\"hljs-number\">1<\/span>).toMillis());\n        }\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Analyse mit JDK Mission Control<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JDK Mission Control (JMC) ist die grafische Analyse-Umgebung. Nach dem \u00d6ffnen einer&nbsp;<code>.jfr<\/code>-Datei zeigt es:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Automatisierte Analyse<\/strong>\u00a0\u2014 Regel-Engine markiert auff\u00e4llige Muster (lange GC-Pausen, hohe Allokation, Lock-Konkurrenz)<\/li>\n\n\n\n<li><strong>Speicher-Tab<\/strong>\u00a0\u2014 GC-Pausen-Zeitlinie, Allokationsraten, h\u00e4ufigste Objekttypen<\/li>\n\n\n\n<li><strong>Code-Tab<\/strong>\u00a0\u2014 Hot Methods mit aggregierten Stacktraces (Flame Graph)<\/li>\n\n\n\n<li><strong>Threads-Tab<\/strong>\u00a0\u2014 Aktivit\u00e4tszeitlinie, blockierte Threads, Lock-Historie<\/li>\n\n\n\n<li><strong>Event-Browser<\/strong>\u00a0\u2014 Rohdaten jedes Events mit vollen Stacktraces<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Typischer Workflow:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Automatisierte Analyse durchgehen \u2192 Rote Flags identifizieren<\/li>\n\n\n\n<li>Speicher-Tab: GC-Pausen ungew\u00f6hnlich lang?<\/li>\n\n\n\n<li>Code-Tab: Welche Methoden verbrauchen die meiste CPU?<\/li>\n\n\n\n<li>Threads-Tab: Gibt es Lock-Konflikte?<\/li>\n\n\n\n<li>Event-Browser: In einzelne Events drill-down mit Stacktraces<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Eine Alternative zur GUI ist das CLI-Tool&nbsp;<code>jfr<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">jfr summary recording.jfr          <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># Event-Statistik<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\njfr print --events jdk.GarbageCollection recording.jfr  <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">em<\/span>&gt;<\/span># GC-Details<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">em<\/span>&gt;<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Produktions-Best-Practices<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;em&gt;<span class=\"hljs-comment\"># Empfohlene Produktions-Flags:&lt;\/em&gt;<\/span>\njava \\\n  -XX:StartFlightRecording:name=prod,maxage=<span class=\"hljs-number\">1<\/span>h,maxsize=<span class=\"hljs-number\">500<\/span>MB,settings=<span class=\"hljs-keyword\">default<\/span>,dumponexit=<span class=\"hljs-keyword\">true<\/span>,filename=\/<span class=\"hljs-keyword\">var<\/span>\/log\/jfr\/<span class=\"hljs-keyword\">exit<\/span>.jfr \\\n  -jar app.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<ul class=\"wp-block-list\">\n<li><code>settings=default<\/code>\u00a0f\u00fcr Always-On (~1% Overhead)<\/li>\n\n\n\n<li><code>maxage<\/code>\u00a0und\u00a0<code>maxsize<\/code>\u00a0begrenzen, um Disk-Volllaufen zu verhindern<\/li>\n\n\n\n<li><code>dumponexit=true<\/code>\u00a0f\u00fcr Post-Mortem-Analyse nach Crash\/OOM<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">JFR ist das untersch\u00e4tzteste Werkzeug des JDK. Es l\u00e4uft immer, kostet fast nichts und liefert im Problemfall genau die Daten, die du brauchst \u2014 ohne dass du vorher einen Profiler installieren musst. Custom Events erlauben dir, dom\u00e4nenspezifische Metriken (Bestellvolumen, API-Latenzen) nahtlos in dasselbe Tool zu integrieren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mein Rat: Aktiviere JFR auf allen produktiven JVMs. Der erste Vorfall, bei dem dir&nbsp;<code>jcmd JFR.dump<\/code>&nbsp;die Ursache in Minuten statt Tagen zeigt, wird dich \u00fcberzeugen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Deine JVM-Anwendung l\u00e4uft langsam, aber du hast keinen Profiler? Oder schlimmer: Sie l\u00e4uft produktiv, und jeder externe Profiler w\u00fcrde sie unbrauchbar verlangsamen? Genau daf\u00fcr wurde Java Flight Recorder (JFR) entwickelt \u2014 ein in die JVM integrierter, kontinuierlicher Profiler mit weniger als 1% Overhead. Dieser Artikel zeigt, wie du JFR einsetzt, eigene Events definierst und mit [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-699","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=699"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/699\/revisions"}],"predecessor-version":[{"id":700,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/699\/revisions\/700"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}