Ich habe JStack gerade verwendet, um das Problem eines Prozess -Deadlocks zu lösen - tatsächlich habe ich es vor langer Zeit gelöst und ich kenne den Grund, aber ich habe den Ort der Deadlock nicht gefunden, deshalb bin ich nicht sehr bereit, dies zu tun.
Der Prozess ist ungefähr wie folgt:
(0) Umweltanforderungen, JDK 1.6 und höher
(1) Finden Sie zuerst die PID des Prozesses. Öffnen Sie in Windows den Prozessmanager und sortieren Sie ihn nach Namen. Sie finden einen Prozess namens javaw.exe (Java Virtual Machine Processs werden alle als Javaw.exe bezeichnet). Sie müssen herausfinden, welcher Prozess Ihr Prozess ist, erinnern Sie sich an die aktuelle Prozessliste und starten Sie dann Ihren Prozess neu. Derjenige, der von der PID aktualisiert wurde, ist Ihr Prozess.
(2) Laufen unter CMD: JStack PID, JStack wird eine Reihe von Informationen auf die Konsole eingeben
(3) Analysieren Sie die obigen Informationen
Beispiel:
Die JStack -Informationen für meine Frage lautet wie folgt:
C:/Dokumente und Einstellungen/Benutzer> JStack 66522012-06-07 21: 32: 02Full Thread Dump Java Hotspot (TM) Client VM (16,3-B01 gemischter Modus, Freigabe): "Thread-1" Dämonung PRIO = 6 TID = 0x03010c00 NID = 0xcdc Warted auf Monitor-Einstieg [0x03010c00 java.lang.thread.state: blockiert (auf Objektmonitor) unter org.apache.commons.net.telet.teletInputstream .__ Read (telnetInputstream.java:122) - Warten auf Sperren <0x22942280> (a org.apache.commons.NET.NET.NETP.ftp.ftp.ftpclient) auf org.apache.commons.net.telnet.telnetInputstream.run (telNetinputstream.java:535) bei Java.lang.Thread.run (Thread.java:619) "Framework Event Dispather" Dämony Prio = 6 Tid = 0x01010400 Nid = 0x998 In Object.wait = 0x01010400 NID = 0x998 In Object.wait () [0x01010400 NID = 0x998 In Object.wait () [0x01010400 NID = 0x998 In Object.wait () [0x01010400 Nid = 0x998 in Object. java.lang.thread.state: Warten (auf Objektmonitor) unter java.lang.object.wait (native Methode) - Warten auf <0x228fa800> (a org.eclipse.osgi.framework org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.getNexevent (EventManager.java:400) - gesperrt <0x228fa800> (a org.eclipse.osgi.framework.eventmgr.eventManager $ $ $ $ $) at org.eclipse.osgi.framework.eventmgr.eventManager $ eventThread.run (EventManager.java:336) "Start -Level -Ereignis -Dispatcher" Dämon -Prio = 6 TID = 0x02fcf400 Nid = 0x2638 in Object.wait.waiting () [0x032De000] java.lang.stata () [0x032De000] java.lang.stata () [0x032De000] java.lang.stata () [0x032de000] java.lang.stata () [0x032De000] java.lang. java.lang.object.wait (native Methode) - Warten auf <0x2295db48> (a [i) bei java.lang.object.wait (Object.java:485) unter org.apache.telnet.telnet.telnetInputstream.Read (telNetinputStream.java.java:java:java:java (a [i) at org.apache.commons.net.telnet.telnetinputstream.read (teletinputstream.java:466) bei java.io.buffenedInputStream.read1 (bufferedInputstream.java:256) at java.bufferedInputStream.READREAM.READINEDIGEDIDELSTREAM.READ (BEGEBETTELN). <0x2295Fe18> (a java.io.bufferedInputStream) at sun.nio.cs.streamdecoder.readBytes (StreamDecoder.java:264) at sun.nio.cs.StreamdeCoder.implread (streamdecoder.java:306) ATREAMDECODER. sun.nio.cs.streamdecoder.read (streamdecoder.java:158) - gesperrt <0x22961f88> (a java.io.inputStreamReader) unter java.io.inputStreamReader.read (InputStreamReader.java:167) ATREADER) ATREAMREADER (InputStreamReader.java:167) ATREAMREADER) java.io.BufferedReader.fill(BufferedReader.java:136) at java.io.BufferedReader.readLine(BufferedReader.java:299) - locked <0x22961f88> (a java.io.InputStreamReader) at java.io.bufufferedReader.readline (bufferedReader.java:362) at org.apache.commons.net.ftp.ftp. org.apache.commons.net.ftp.ftpclient._connectaction_ (ftpclient.java:550) unter org.apache.commons.net.socketclient.connect (socketclient.java:163) bei com.mycompany.dc.ftp.client.ftpclientImpl.connect (ftpclientImpl.java:75) - gesperrt <0x22942280> (a org.apache.nons.net.ftp.ftpclient) unter com.mycompany.dc.ftp.client.ftpclientfactoryImpl.getClient (ftpclientFactoryImpl.java:35) - gesperrt <0x228f9310> (a java.lang.object) at ftpclientt.activator.start (activator.java:43) at ftpclientest.start (activator.java org.eclipse.osgi.framework.internal.core.bundlecontextimpl $ 1.run (bundlecontextimpl.java:711) bei Java.security.accesscontroller.Doprivilegiert (native Methode) bei org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:702) at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683) at org.eclipse.osgi.framework.internal.core.bundleHost.startworker (bunteHost.java:381) at org.eclipse.osgi.framework.internal.core.abstractbundle.resume (AbstractBundle.java:389) Attract org.eclipse.osgi.framework.internal.core.framework.resumebundle (Framework.java:1131) unter org.eclipse.osgi.framework.internal.core.Startlevelmanager.Resumebundles (Streetlevelmanager.java:559) AttartlevelManager (Streatlevelmanager.java:559) ATREATLE. org.eclipse.osgi.framework.internal.core.startlevelManager.Resumebundles (StartlevelManager.java:544) bei org.eclipse.osgi.framework.internal.core.startlevelmanager.incfwsl (braunslevel.java.java.java.java. org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetStartLevel (StartlevelManager.java:243) - gesperrt <0x27e68d70> (a java.lang.object) bei org.eclipse.osgi.framework.internal.core.StartlevelManager.DispatchEvent (StartlevelManager.java:438) bei org.eclipse.osgi.framework.internal.core.startlevelmanager.Dispatchevent (straßeLevelManager.java:1) bei Startlevel.java. org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230) at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:340)"Framework Active Thread" prio=6 tid=0x02ff1800 NID = 0x1fbc in Object.wait () [0x0328f000] java.lang.thread.state: Timed_waiting (auf Objektmonitor) unter java.lang.object.wait (native Methode) - Warten auf <0x27e6570> (a org.eclipse.osgi.Framework) bei org. org.eclipse.osgi.framework.internal.core.framework.run (Framework.java:1817) - gesperrt <0x27e65770> (a org.eclipse.osgi.Framework.internal.core.Framework) auf java.lang.lang.ack.lang.lang.And.And.And.And.Arg.And.Arg.And.Arg.Arg.Arg.Arg.Rang.RUND.Run (thread.java:619) "Oslang.And.Ang.And.Ang. PRIO = 6 TID = 0x03005400 NID = 0x225C Wardiert unter Zustand [0x0323f000] org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole (FrameworkConsole.java:125) unter org.eclipse.osgi.framework.internal.core.frameworkconsole.run (FrameworkConsole.java:104) AtworkConsole.java:104) Atorne.java:104) Atmatconsole.java:104) Atomd) java.lang.thread.run (thread.java:619) "Low -Memory Detector" Dämon Prio = 6 TID = 0x02C09800 NID = 0x1D68 Runnable [0x000000000] Java.lang.Lang.Thread.State: Runnable "compilerwartthread = 0x22. on condition[0x000000000] java.lang.Thread.State: RUNNABLE"Attach Listener" daemon prio=10 tid=0x02c01800 nid=0x1138 waiting on condition[0x000000000] java.lang.Thread.State: RUNNABLE"Signal Dispatcher" daemon prio=10 tid=0x02c20c00 nid=0x18ac runnable [0x000000000] java.lang.thread.State: Runnable "Finalizer" Dämon Prio = 8 TID = 0x02BC0400 NID = 0x11ac in Object.wait () [0x02d8f000] Java.Lang.Thread.State: Warted (auf Objektmonitor) bei Java.Lang.Ob. <0x27d5e5c8> (a java.lang.ref.Referencequeue $ lock) unter java.lang.ref.referencequeue.remove (referencequeue.java:118) - gesperrt <0x27d5e5c8> (a java.lang.ref.Reffesquee $ lock) at $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ lock $ $ Java.lang.Ref.Referencequeue.remove (referencequeue.java:134) bei Java.lang.Ref.Finalizer $ FinalizerThead.run (Finalizer.java:159) "Referenzhandler" Dämonung Prio = 10 Tid = 0x02bb800 Nid ups 0x9cc. java.lang.thread.state: Warten (auf Objektmonitor) unter java.lang.object.wait (native Methode) - Warten auf <0x27d5e650> (a java.lang.ref.Reference $ lock) bei java.lang.object.wait (Object.java:485) bei java.lang.ref.Reference $ referenceHandler.run (reference.java:116) - gesperrt <0x27d5e650> (a java.lang.ref.Reference $ lock) "Haupt -" -Prio = 6 Tid = 0x008a6c00 Nid = 0x22ec in Object.wait.wait () [0x0098f000] Timed_waiting (auf Objektmonitor) bei java.lang.object.wait (native Methode) - Warten auf <0x22c303c8> (a org.eclipse.core.runtime gesperrt <0x22c303c8> (a org.eclipse.core.runtime.internal.adaptor.semaphore) bei org.eclipse.core.runtime.adaptor.eclipsestarter.updatessplash (EclipsSestarter.java:1251) at ATRADSPLASH (EclipsSestarter.java:1251) at terdarter.updates (eclipsSestarter.java:1251) at terdarter.updates (eclipsSestarter.java. org.eclipse.core.runtime.adaptor.eclipsestarter.setStartLevel (eclipsSestarter.java:1213) bei org.eclipse.core.runtime.adaptor.eclipsSestarter.Startup (EclipsSestarter.java:288) Attartup (EclipsSestarter.java:288) attartup (eclipsSestarter.java:288) Attarter. org.eclipse.core.runtime.adaptor.eclipSestarter.run (eclipsSestarter.java:175) at sun.reflect.nativemethodaccessorimpl.invoke0 (native Methode) bei sun.reflect.nativemethodaccessorimPl.Invoke (nativemethodaccessorimPl.Invoke (nativemethoccessorimple sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) at org.eclipse.equinox.launcher.main.basicrun (main.java:577) at org.eclipse.equinox.launcher.main.run (main.java:1410) at org.eclipse.equinox.laerer.main.main.main.main (Main.java:1386) "vmain.main.main (main.java:1386)" " TID = 0x02bba000 NID = 0xDB4 Runnable "VM Periodic Task -Thread" PRIO = 10 TID = 0x02C0E400 NID = 0x24AC Wartet auf konditionjni globale Referenzen: 677
analysieren:
Gemäß der Eingabeaufforderung verwenden beide Threads das FTPClient -Objekt als Sperre, und das vorherige, der das Schloss erhält, muss warten, bis die nächste das Rückgabeergebnis des Schlosses benötigt, was zu einem Deadlock führt. Diese beiden Orte sind:
(1) unter org.apache.commons.net.telnet.teletinputstream .__ Read (telnetInputstr
eam.java:122)
(2) - gesperrt <0x22942280> (a org.apache.commons.net.ftp.ftpclient)
unter com.sagemcom.dc.ftp.client.ftpclientFactoryImpl.getClient (ftpclientfa
ctoryImpl.java:35)
- gesperrt <0x228f9310> (a java.lang.Object)
Ersteres ist das von dem System selbst verwendete Schloss, und letzteres wird in meinem Code hinzugefügt. Es wird gelöst, indem ein Objekt in Ihrem eigenen Code geändert wird, um es zu sperren.
Zusammenfassen
JStack ist sehr hilfreich bei der Lösung von Problemen. Die Informationen sind prägnant und effektiv. Tatsächlich basieren darauf viele grafische Analyse -Tools. JStack muss jedoch von JDK1.6 oder höher unterstützt werden.
Das obige ist der gesamte Inhalt dieses Artikels zum Lösen von Problemen mit Prozessdlockproblemen durch JStack -Analyse. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!