Der Inhalt dieses Artikels befasst sich mit der Verwendung des JDK-Tools jstack, um die Ursache des Laufzeit-Programm-Deadlocks herauszufinden. Ich hoffe, dass er für Sie hilfreich ist.
Java-Multithread-Programmierung ist auch ein häufig untersuchter Inhalt in Java-Interviews. Freunde, die neu in der Java-Multithread-Programmierung sind, schreiben möglicherweise versehentlich einige Anwendungen, die zu Deadlocks führen können. Wie analysiert man die Ursachen von Java-Multithreading? Oftmals setzen wir Haltepunkte und einstufiges Debugging für Anweisungen, bei denen der Verdacht besteht, dass sie einen Deadlock verursachen, die aber nicht reproduziert werden können. Dieses Phänomen ist normal, da der Zeitpunkt der Codeausführung zwischen dem Debuggen in einem Schritt und dem direkten Ausführen des Programms unterschiedlich ist und die Auslösebedingungen für einen Deadlock möglicherweise nicht erfüllt sind.
Tatsächlich hat JDK Java-Programmierern leistungsstarke Deadlock-Analysetools zur Verfügung gestellt, mit denen eine laufende und Deadlock-Statusanwendung direkt analysiert und die spezifische Zeile angegeben werden kann des Java-Codes, der den Deadlock verursacht hat.
In diesem Artikel wird anhand eines Beispiels gezeigt, wie die vom JDK bereitgestellten Standardtools verwendet werden.
Dieses Tool heißt jstack und ist eine ausführbare Datei im bin-Ordner des JDK-Installationsverzeichnisses.
Wir schreiben zuerst eine Anwendung, die einen Deadlock verursacht.
public class DeadLockExample { public static void main(String[] args) { final String resource1 = "ABAP"; final String resource2 = "Java"; Thread t1 = new Thread() { public void run() { synchronized (resource1) { System.out.println("Thread 1: locked resource 1"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource2) { System.out.println("Thread 1: locked resource 2"); } } } } ; Thread t2 = new Thread() { public void run() { synchronized (resource2) { System.out.println("Thread 2: locked resource 2"); try { Thread.sleep(100); } catch (Exception e) { } synchronized (resource1) { System.out.println("Thread 2: locked resource 1"); } } } } ; t1.start(); t2.start(); } }
Die Anwendungsidee ist sehr einfach. Starten Sie zwei Threads gleichzeitig, sperren Sie Ressource1 bzw. Ressource2, schlafen Sie dann 0,1 Sekunden lang und versuchen Sie dann, die Ressourcen Ressource2 bzw. Ressource1 anzufordern.
Führen Sie die Anwendung aus und geben Sie den Deadlock-Status ein, nachdem Sie die folgende Ausgabe auf der Konsole gedruckt haben:
Thread 1: gesperrte Ressource 1
Thread 2: gesperrte Ressource 2
Verwenden Sie die Befehlszeile jps -l -m, um die Prozess-ID der Anwendung im Deadlock-Zustand zu ermitteln. Aus der folgenden Abbildung wissen wir, dass der Deadlock-Prozess 51476 ist:
Verwenden Sie dann den Befehlszeilen-JStack 51476, um die laufenden Stapelinformationen davon auszudrucken Verfahren.
Die im Bild oben rot hervorgehobenen 0x00000000d6f64988 und 0x00000000d6f649b8 repräsentieren die beiden Ressourcen „ABAP“ und „Java“ im Code.
Die von jstack gedruckte Ausgabe ist sehr klar und zeigt, welche Zeile des Java-Codes versucht hat, welche Java-Ressource zu sperren (in der Abbildung unten wurde auf die Sperre gewartet), aber fehlgeschlagen ist, und der Grund für den Fehler war, dass sie der Besitzer der Die aktuell angeforderte Ressource wird ebenfalls gedruckt.
Mit jstack müssen Java-Programmierer nicht mehr lange über langen und hirnverbrennenden Multithread-Code nachdenken, JDK gibt automatisch die Ursache dafür aus Der Stillstand Es ist so bequem, herauszukommen.
Das obige ist der detaillierte Inhalt vonVerwenden Sie das JDK-Tool jstack, um die Ursache für den Deadlock des Laufzeitprogramms herauszufinden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!