Heim  >  Artikel  >  Java  >  Debuggen und überwachen Sie Java-Apps mit VisualVM und jstack

Debuggen und überwachen Sie Java-Apps mit VisualVM und jstack

DDD
DDDOriginal
2024-11-07 08:37:02114Durchsuche

Java-Anwendungen, insbesondere solche, die in der Produktion ausgeführt werden, können zu Leistungsengpässen, Deadlocks und Speicherlecks führen, deren Nachverfolgung schwierig sein kann. Wenn diese Probleme auftreten, ist ein schnelles und effektives Debugging unerlässlich, um den reibungslosen Betrieb von Anwendungen und ein positives Benutzererlebnis zu gewährleisten. Hier werden VisualVM und JStack zu unschätzbaren Werkzeugen für Java-Entwickler.

VisualVM mit seinen leistungsstarken Profilierungs- und Überwachungsfunktionen und jstack mit detaillierten Thread-Dumps sind ein dynamisches Duo, mit dem Entwickler komplexe Probleme erkennen, diagnostizieren und debuggen können Leichtigkeit.

Die Diagnose und Behebung von Deadlocks ist besonders bei Hochleistungsanwendungen von entscheidender Bedeutung. In diesem Leitfaden erfahren Sie, wie Sie mit zwei leistungsstarken Java-Tools Deadlocks erkennen und Thread-Dumps erhalten: VisualVM und jstack.

1. Deadlocks und Thread-Dumps verstehen

Bevor wir uns mit den Tools befassen, klären wir ein paar Grundlagen:

Deadlock: Eine Situation, in der Threads aufeinander warten, um Ressourcen freizugeben, was zu einem unbestimmten Blockierungszyklus führt.

Thread-Dump: Eine Momentaufnahme der aktiven Threads innerhalb einer Java-Anwendung zu einem bestimmten Zeitpunkt, einschließlich Details zu ihren Zuständen und etwaigen Sperren, die sie halten oder auf die sie warten. Ein Thread-Dump ist für die Analyse und Identifizierung von Deadlock-Quellen in Java-Anwendungen von entscheidender Bedeutung, damit Entwickler die Ursache blockierter Threads genau bestimmen können.

2. Einführung in VisualVM

VisualVM ist ein visuelles Tool, das mehrere Befehlszeilen-JDK-Tools integriert, um einen umfassenden Überblick über Java-Anwendungen zu liefern. Es wird häufig zur Überwachung und Profilierung von Anwendungen, zur Diagnose von Speicherlecks und zur Leistungsanalyse verwendet.

Hauptmerkmale

  • Live-Überwachung und Profilerstellung
  • Thread-Analyse
  • Einblicke in die Speicher- und CPU-Nutzung
  • Thread-Dumps zur Deadlock-Analyse

Debuggen mit VisualVM (für Java-Anwendungen)

  • Laden Sie VisualVM herunter
  • Öffnen Sie VisualVM.
  • Stellen Sie eine Verbindung zum laufenden JVM-Prozess her.
    Debug and Monitor Java App with VisualVM and jstack

  • In den Überwachungstools können Sie auf Thread-Dump klicken oder Thread-Details in Echtzeit anzeigen.

Debug and Monitor Java App with VisualVM and jstack

Debug and Monitor Java App with VisualVM and jstack

3. Einführung in jstack

jstack ist ein unschätzbar wertvolles Befehlszeilentool für jeden Java-Entwickler, der mit komplexen Anwendungen arbeitet, die stark auf Threads angewiesen sind. Durch die Bereitstellung detaillierter Einblicke in Thread-Status, Sperrverhalten und Ausführungsfluss vereinfacht jstack den Debugging-Prozess und erleichtert das Erkennen und Beheben von Problemen wie Deadlocks, Leistungsengpässen und Anwendungsabstürzen.

Hauptmerkmale

  • jstack zeigt den Status jedes Threads an, z. B. RUNNABLE, BLOCKED, WAITING oder TIMED_WAITING.
  • Erfassen Sie Stack-Traces für aktive oder blockierte Prozesse, um das Debuggen komplexer Threading-Probleme zu erleichtern.
  • jstack markiert festgefahrene Threads im Thread-Dump, sodass Sie sie schnell identifizieren können.
  • Besorgen Sie sich einen Thread-Dump, der alle aktiven Threads in der JVM auflistet.
  • In Kombination mit anderen Tools wie VisualVM oder jmap kann jstack dabei helfen, Speicherlecks auf Threads zurückzuführen, die für übermäßige Objekterstellung oder das Festhalten an Referenzen verantwortlich sind.
  • Durch die Analyse von Thread-Dumps können Entwickler problematische Synchronisierung, übermäßiges Blockieren oder Möglichkeiten zur Reduzierung von Konflikten identifizieren, was zu einer verbesserten Parallelität und Reaktionsfähigkeit führt.

Verwenden von jstack zum Abrufen und Analysieren von Thread-Dumps

Um einen Thread-Dump einer laufenden Java-Anwendung mit jstack zu erfassen, benötigen Sie die Prozess-ID (PID) des Java-Prozesses. Hier ist eine Schritt-für-Schritt-Anleitung:

  • Schritt 1: Finden Sie die Prozess-ID (PID) der Java-Anwendung
C:\Program Files\Java\jdk-21\bin>jps -l
12912
22480 org.springframework.ide.vscode.boot.app.BootLanguageServerBootApp
24020 jdk.jcmd/sun.tools.jps.Jps
14344 org/netbeans/Main
21944 deadlock/deadlock.DeadlockExample
  • Schritt 2: Verwenden Sie jstack, um den Thread-Dump zu erfassen
C:\Program Files\Java\jdk-21\bin>jstack 21944
2024-11-02 11:12:18
Full thread dump Java HotSpot(TM) 64-Bit Server VM (21.0.5+9-LTS-239 mixed mode, sharing):

Threads class SMR info:
.
..
....
...

"Thread-0" #29 [18484] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395ac40 nid=18484 waiting for monitor entry  [0x00000099227ff000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23)
        - waiting to lock <0x000000070d03c740> (a java.lang.Object)
        - locked <0x000000070d05a828> (a java.lang.Object)
        at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source)
        at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596)
        at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583)

"Thread-1" #30 [23240] prio=5 os_prio=0 cpu=0.00ms elapsed=1896.34s tid=0x000001bb3395b2a0 nid=23240 waiting for monitor entry  [0x00000099228ff000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41)
        - waiting to lock <0x000000070d05a828> (a java.lang.Object)
        - locked <0x000000070d03c740> (a java.lang.Object)
        at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source)
        at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596)
        at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583)

...
.....
..
Found one Java-level deadlock:
=============================
"Thread-0":
  waiting to lock monitor 0x000001bb117727a0 (object 0x000000070d03c740, a java.lang.Object),
  which is held by "Thread-1"

"Thread-1":
  waiting to lock monitor 0x000001bb11772500 (object 0x000000070d05a828, a java.lang.Object),
  which is held by "Thread-0"

Java stack information for the threads listed above:
===================================================
"Thread-0":
        at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:23)
        - waiting to lock <0x000000070d03c740> (a java.lang.Object)
        - locked <0x000000070d05a828> (a java.lang.Object)
        at deadlock.DeadlockExample$$Lambda/0x000001bb350019f8.run(deadlock/Unknown Source)
        at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596)
        at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583)
"Thread-1":
        at deadlock.DeadlockExample.lambda(deadlock/DeadlockExample.java:41)
        - waiting to lock <0x000000070d05a828> (a java.lang.Object)
        - locked <0x000000070d03c740> (a java.lang.Object)
        at deadlock.DeadlockExample$$Lambda/0x000001bb35001c08.run(deadlock/Unknown Source)
        at java.lang.Thread.runWith(java.base@21.0.5/Thread.java:1596)
        at java.lang.Thread.run(java.base@21.0.5/Thread.java:1583)

Found 1 deadlock.

Notiz

  • jstack ist im JDK verfügbar. Stellen Sie daher sicher, dass das JDK in Ihrer Umgebung installiert und zugänglich ist.
  • Für die Verwendung von jstack sind auf einigen Systemen möglicherweise Administratorrechte erforderlich.
  • Mit jstack -l 12345 > threaddump.txt speichert den Thread-Dump in einer Datei namens threaddump.txt.

Outro

VisualVM und jstack sind zwei wesentliche Tools im Toolkit des Java-Entwicklers zur Diagnose und Fehlerbehebung von Java-Anwendungen, insbesondere beim Umgang mit Leistungsproblemen, Deadlocks und Thread-Engpässen.

Zusammen bieten VisualVM und jstack einen umfassenden Ansatz zum Debuggen von Java-Anwendungen, wobei VisualVM umfassende Echtzeit-Einblicke in die Leistung und jstack bietet Ermöglicht eine umfassende Analyse auf Thread-Ebene. Ihre kombinierte Nutzung ermöglicht es Entwicklern, komplexe Java-Probleme sowohl in Entwicklungs- als auch in Produktionsumgebungen effektiv zu diagnostizieren und zu lösen.

Referenz

Ein großes Dankeschön an die Online-Dokumentation, die Community und alle verfügbaren Ressourcen, die diesen Artikel ermöglicht haben.

  1. So verwenden Sie VisualVM
  2. Multithreading-Konzepte Teil 1: Atomarität und Unveränderlichkeit
  3. Java VisualVM

Das obige ist der detaillierte Inhalt vonDebuggen und überwachen Sie Java-Apps mit VisualVM und jstack. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn