Zum Inhalt springen

Überwachung und Profiling

Zeichnen Sie JFR-Dateien auf, erstellen Sie Heap-Dumps, beobachten Sie einen laufenden Elide-Prozess mit jcmd, jps und jstat, und profilieren Sie mit Linux perf über die Instrumentierungs-Flags.

Auf dieser Seite

Die Instrumentierungs-Flags zeichnen auf, was ein Elide-Prozess während der Ausführung tut.

FrageAufzeichnungAuswerten mit
Was ist während des Laufs passiert?--jfr=run.jfrjfr aus dem JDK
Was liegt im Heap?--heap-dump=heap.hprofVisualVM
Wie verhält sich der Heap über die Zeit?--vmstatjps, jstat
Was tut ein laufender Prozess?jcmd PIDJFR, Heap-Dumps, Thread-Stacks
Wo verbraucht kompilierter Code CPU-Zeit?--jitdump=DIRLinux perf

Listen Sie die Flags mit elide help instruments auf. Sie gelten für run sowie für Skripte, Snippets und Module. Setzen Sie sie vor jedes -- oder -m MODULE. Eine JDK-25-Installation liefert jfr, jcmd, jps und jstat; VisualVM liest Heap-Dumps. Zu Abdeckung, CPU-Tracing und Debuggern siehe Debugging. Um Traces, Metriken und Logs an ein Observability-Backend zu exportieren, siehe OpenTelemetry.

Mit JFR aufzeichnen

elide --jfr=run.jfr run app.js
jfr summary run.jfr
jfr print --events 'dev.elide.*' run.jfr

--jfr nutzt die Einstellungen profile und speichert beim normalen Beenden. --jfr-settings=default oder ein .jfc-Pfad wählt andere Einstellungen. Dateinamen und Einstellungen dürfen keine Kommas oder doppelten Anführungszeichen enthalten.

EreignisZeichnet auf
dev.elide.BootStart abgeschlossen; elapsedNanos ist die Startzeit.
dev.elide.GuestStart / dev.elide.GuestStopLauf des Einstiegsprogramms, mit Sprache, Dauer, Ergebnis, Exit-Code.
dev.elide.HttpRequest / dev.elide.HttpResponseEine bediente Anfrage, mit Methode, Protokoll, Status, Dauer.
dev.elide.HttpClientExchangeEine ausgehende Anfrage, mit Warte- und Verbindungszeit, Protokoll, Status und Body-Bytes.
dev.elide.TransportTlsHandshakeEin TLS-Handshake, mit Dauer, Rolle, Ergebnis und ALPN.
dev.elide.ExecutionDer Befehl ist beendet, mit seinem Exit-Code.

URLs, Header und Nutzdaten werden nicht aufgezeichnet.

Heap-Dump erstellen

elide --heap-dump=heap.hprof run app.js
elide --heap-dump-on-oom=oom.hprof run app.js
visualvm --openfile heap.hprof

--heap-dump schreibt beim normalen Beenden. --heap-dump-on-oom schreibt bei einem Out-of-Memory-Fehler und beendet dann den Prozess, ohne Shutdown-Hooks auszuführen.

Laufenden Prozess beobachten

elide --vmstat run app.js &
jps -l
jstat -gc PID 1s

--vmstat führt den Prozess in jps auf (per PID, ohne Namen) und lässt jstat ihn abfragen. jcmd verbindet sich per PID mit oder ohne --vmstat, unter Linux und macOS, als derselbe Betriebssystembenutzer:

jcmd PID help
jcmd PID JFR.start name=profile settings=profile
jcmd PID JFR.dump name=profile filename=live.jfr
jcmd PID GC.heap_dump live.hprof
jcmd PID Thread.print

Ein gewaltsam beendeter Prozess schreibt seine Aufzeichnungen nicht. Sichern Sie eine laufende Aufzeichnung mit jcmd, bevor Sie den Prozess stoppen.

Mit perf unter Linux profilieren

perf record -k 1 --call-graph fp -o perf.data -- elide --jitdump=./jitdump run app.js
perf inject -j -i perf.data -o perf.jit.data
perf report -i perf.jit.data

--jitdump funktioniert in Linux-Release-Builds. Behalten Sie das Verzeichnis jitdump, bis perf inject fertig ist. Häufig ausgeführte Funktionen erscheinen unter jitted--Objekten. Ein Exit-Code null beweist keine gültige Aufzeichnung; prüfen Sie, dass der Bericht Ihre Funktionen zeigt. Unter WSL2 muss perf zum laufenden Kernel passen.

VM-Optionen

Jedes Flag hat eine Schreibweise als VM-Option:

--jfr=run.jfr                 -XX:StartFlightRecording=filename=run.jfr,settings=profile,dumponexit=true
--heap-dump-on-oom=oom.hprof  -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=oom.hprof -XX:+ExitOnOutOfMemoryError
--vmstat                      -XX:+UsePerfData
--jitdump=DIR                 -XX:+RuntimeJitdump -XX:RuntimeJitdumpDir=DIR

-XX:+DumpHeapAndExit -XX:HeapDumpPath=initial.hprof schreibt einen Dump des anfänglichen Heaps und beendet sich dann. -Xmx und -XX:MaxHeapSize sind dieselbe Einstellung wie --max-mem; beide anzugeben ist ein Fehler.

War diese Seite hilfreich?