私はJstackを使用してプロセスのデッドロックの問題を解決しました - 実際、私はずっと前にそれを解決しました、そして私は理由を知っていますが、私はデッドロックの場所を見つけていないので、私はそうするつもりはありません。
プロセスはほぼ次のとおりです。
(0)環境要件、JDK 1.6以降
(1)最初にプロセスのPIDを見つけます。 Windowsで、プロセスマネージャーを開き、名前で並べ替えます。 javaw.exeというプロセスを見つけることができます(Java仮想マシンプロセスはすべてjavaw.exeと呼ばれます)。どのプロセスがプロセスであるかを見つけ、現在のプロセスリストを覚えてから、プロセスを再起動する必要があります。 PIDによってリフレッシュされたのは、プロセスです。
(2)CMDの下で実行:jstack pid、jstackはコンソールに一連の情報を入力します
(3)上記の情報を分析します
例:
私の質問のjstack情報は次のとおりです。
c:/documents and settings/user> jstack 66522012-06-07 21:32:02fullスレッドダンプJava Hotspot(TM)クライアントVM(16.3-B01ミックスモード、共有):「スレッド1」 java.lang.thread.state:org.apache.commons.net.telnetinputStreamでブロックされた(オブジェクトモニター)。__読み取り(telnetinputStream.java:122) - ロックを待つ<0x222942280> org.apache.commons.net.telnet.telnetinputstream.run(telnetinputstream.java:535)at java.lang.thread.run(thread.java:619) "フレームワークイベントディスパッチャー" [0x0334f000] java.lang.thread.state:java.lang.object.waitで待機(オブジェクトモニター)(ネイティブメソッド) - 待機org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.getNextevent(eventmanager.java:400)-locked <0x228fa800>(a org.osgi.framework.eventmgr.eventmgr.eventmgr.eventthread)at org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.run(eventmanager.java:336) "Start Level Event Dispatcher" Daemon Prio = 6 TID = 0x02FCF400 NID = 0x2638 in object.wait java.lang.object.wait(native method)-waining <0x22295db48>(a [i)at java.lang.object.wait(object.java:485)at org.apache.commons.net.telnet.telnetinputem.read(telnetinputtretream.java:399) <0x2295db48>(a [i)at org.apache.commons.net.telnetinputstream.read(telnetinputstream.java:466)at java.io.bufferedinputstream.read1(bufferedinputstream.java:256) Java.io.BufferedInputStream.Read(BufferedInputStream.java:317)-Locked <0x2295fe18>(a java.io.bufferedinputStream)at sun.nio.cs.streamdecoder.readbytes(streamdecoder.java:264)at sun.nio.cs.streamdecoder.implread(streamdecoder.java:306)at sun.nio.cs.streamdecoder.read(streamdecoder.java:158)-Locked <0x22961f88> java.io.inputStreamReader.Read(inputStreamReader.java:167)at java.io.bufferedreader.fill(bufferedreader.java:136)at java.io.bufferedreader.readline(bufferedreader.java:299) java.io.inputStreamReader)at java.io.bufferedreader.readline(bufferedreader.java:362)at org.apache.commons.net.ftp.ftp .__ getReply(ftp.java:264)at org.apache.commons.net.ftpclient._connectaction_(ftp.java:335)at org.apache.commons.net.socketclient.connect.connect.connection com.mycompany.dc.ftp.client.ftpclientimpl.connect(ftpclientimpl.java:75)-locked <0x222942280>(a org.apache.commons.net.ftp.ftpclient) com.mycompany.dc.ftp.client.ftpclientfactoryimpl.getClient(ftpclientfactoryimpl.java:35)-ftpclienttest.activator.start(activator.java:43)at ftpclienttest.activator.start(a java.lang.object)<0x228f9310>(a java.lang.object) org.eclipse.osgi.framework.internal.core.bundlecontextimpl $ 1.run(bundlecontextimpl.java:711)at java.security.accesscontroller.doprivileded(ネイティブメソッド) org.eclipse.sgi.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(bundlehost.java:381)at org.eclipse.osgi.framework.internal.core.abstractbundle.resume(abstractbundle.java:389)at org.eclipse.osgi.internal.core.framework.resumebundle(framework.java:1131)at org.eclipse.osgi.framework.internal.core.startlevelmanager.resumebundles(startlevelmanager.java:559)at org.eclipse.osgi.internal.core.startlevelmanager.resumebundles(startlevelmanager.java:544)at org.eclipse.osgi.framework.internal.core.startlevelmanager.incfwsl org.eclipse.osgi.framework.internal.core.startlevelmanager.dosetstartlevel(startlevelmanager.java:243)-locked <0x27e68d70>(java.lang.object)at org.eclipse.sgi.framework.internal.core.startlevelmanager.dispatchevent(startlevelmanager.java:438)at org.eclipse.osgi.framework.internal.core.startlevelmanager.dispatchervent org.eclipse.osgi.framework.eventmgr.eventmanager.dispatchevent(eventmanager.java:230)at org.eclipse.osgi.framework.eventmgr.eventmanager $ eventthread.run(eventmanager.java:340) object.wait()[0x0328f000] java.lang.thread.state:java.lang.object.wait(native method)のtimed_waiting(オブジェクトモニター)(ネイティブメソッド)のnid = 0x1fbc(object monitor) - <0x27e65770>(a org.eclipse.sgi. framework.core.core. org.eclipse.sgi.internal.core.framework.run(framework.java:1817)-locked <0x27e65770>(org.eclipse.osgi.framework.internal.core.framewark) prio = 6 tid = 0x03005400 nid = 0x225c waiting for condition [0x0323f000] java.lang.thread.state:java.lang.thread.sleep(native method)at java.lang.thread.sleep(sleeping) org.eclipse.osgi.framework.internal.core.frameworkconsole.runconsole.runconsole(frameworkconsole.java:125)at org.eclipse.osgi.framework.internal.core.frameworkconsole.run(frameworkconsole.java:104)at java.lang.thread.run(thread.java:619) "Low Memory Detector" daemon prio = 6 tid = 0x02c09800 nid = 0x1d68 runnable [0x000000000] java.lang.thread.state:runnable "cybilerthead0" [0x000000000] java.lang.thread.state:runnable "adtach ristener" daemon prio = 10 tid = 0x02c01800 nid = 0x1138 nid = 0x1138 java.lang.thread.state:runnable "signal" daemon prio = 10 tid = 0x022012012022022 [0x000000000] java.lang.thread.state:runnable "finalizer" daemon prio = 8 tid = 0x02bc0400 nid = 0x11ac in object.wait()[0x02d8f000] java.lang.thread.state:java.lang.object.waitの待機中) Java.lang.lang.referencequeue.Remove(reference.java:118)-Locked <0x27d5e5c8>(a java.lang.ref.referencerion $ lock)のjava.lang.referencequeue.Remove(java.lang.referenceque $ lock)の<0x27d5e5c8>(a java.lang.referencequeue $ lock) Java.lang.ref.ReferenceQueue.Remove(ReferenceQueue.java:134)at java.lang.ref.finalizer $ finalizerthread.run(finalizer.java:159) java.lang.thread.state:Java.lang.object.wait(native Method)の待機(オブジェクトモニター)(ネイティブメソッド) - <0x27d5e650>(a java.lang.reference $ lock)で待機java.lang.ref.Reference $ referenceHandler.run(Reference.java:116)-Locked <0x27d5e650>(java.lang.ref.reference $ lock) "main" prio = 6 tid = 0x008a6c00 nid = 0x22ec in object.wait( java.lang.object.wait(ネイティブ方法)のtimed_waiting(オブジェクトモニター) - <0x22c303c8>(org.eclipse.core.runtime.internal.adaptor.semaphore)org.eclipse.core.runtime.intor.semaphore.acquire( locked <0x22c303c8>(a org.eclipse.core.runtime.internal.adaptor.semaphore)at org.eclipse.core.runtime.adaptor.eclipsestarter.updatesplash(eclipsestartarter.java:1251) org.eclipse.runtime.adaptor.eclipsestarter.setstartlevel(eclipsestarter.java:1213)at org.eclipse.core.runtime.adaptor.eclipsestartarter.startup(eclipsestartarter.java:288) org.eclipse.runtime.adaptor.eclipsestarter.run(eclipsestarter.java:175)at sun.reflect.nativemethodaccessorimpl.invoke0(ネイティブ方法)sun.reflt.nativemethodaccessimpl.invoke sun.Reflect.DELEGATINGMETHODACCERSIMPL.INVOKE(DelegatingMethodaccessorimpl.java:25)at java.lang.reflt.method.invoke(Method.java:597)at org.eclipse.efinox.launcher.main.main.Invokeframework(main.java) org.eclipse.equinox.launcher.main.run(main.java:1410)at org.eclipse.equinox.launcher.main.main(main.java:1386 "prio" prio:1386 "vm swood:1386)" vm swood "vmava" vmava:1386)at org.eclipse.equinox.launcher.main.run(main.java:577)atorg.eclipse.equinox.main.main.main.basicrun.main.main.basicrun(main.java:577) Tid = 0x02bba000 nid = 0xdb4 runnable "vm周期タスクスレッド" prio = 10 tid = 0x02c0e400 nid = 0x24Ac条件で待機中のグローバル参照:677
分析:
プロンプトによると、両方のスレッドはftpclientオブジェクトをロックとして使用し、ロックを取得する前のスレッドは、次のロックがロックのリターン結果を必要とするのを待つ必要があり、デッドロックが発生します。これらの2つの場所は次のとおりです。
(1)atorg.apache.commons.net.telnet.telnetinputStream .__ read(telnetinputstr
eam.java:122)
(2)-Locked <0x22942280>(org.apache.commons.net.ftp.ftpclient)
com.sagemcom.dc.ftp.client.ftpclientfactoryimpl.getClient(ftpclientfa
ctoryimpl.java:35)
-Locked <0x228f9310>(java.lang.object)
前者はシステム自体が使用するロックであり、後者は私のコードに追加されています。独自のコードでオブジェクトを変更してロックすることで解決されます。
要約します
JSTackは問題を解決するのに非常に役立ちます。情報は簡潔で効果的です。実際、それに基づいた多くのグラフィカル分析ツールがあります。ただし、JSTACKはJDK1.6以上でサポートする必要があります。
上記は、JSTACK分析によるプロセスのデッドロックの問題を解決するためのこの記事の全体的な内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!