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.
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.
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.
Stellen Sie eine Verbindung zum laufenden JVM-Prozess her.
In den Überwachungstools können Sie auf Thread-Dump klicken oder Thread-Details in Echtzeit anzeigen.
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.
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:
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
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.
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.
Ein großes Dankeschön an die Online-Dokumentation, die Community und alle verfügbaren Ressourcen, die diesen Artikel ermöglicht haben.
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!