jstackに依存しないjavaスレッドdumpとデッドロックチェックツール

2848 ワード

JAvaスレッドdumpはjdkのコマンド「jstack」を使用できます pid」が完了し、デッドロックチェックはjconsoleで表示できます.この2つのツールはjavaデバッグの一般的な方法です.
 
私が直面した問題は:sles 11 sp 3のサービスの上でテストして、上はIBM J 9 VM jreだけあって、デフォルトはjdkをインストールしていないで、jdkをインストールした後にjstackコマンドがないことを発見して、システムがグラフィックインタフェースを起動していないため、jconsoleも使用することができなくて、最後にvnc serverをインストールして、xtermの中でjconsoleを開けてやっと問題に位置付けます.
 
そこでjdkに頼らず、J 9 VM jreとoracleのjreでスタックを印刷できるツールを作りたいと思います.すると次のものがありました.
 
このツールは現在のJVMのスタックしか取得できません.httpサーバ、webサービスなど、周辺のインタフェースから出力する必要があります.コードは主にjconsoleのソースコードから出てきます.出力のフォーマットはjstackと一致します.
ThreadMXBeanを使用してスレッドスタック情報を取得し、出力するのが原理です.
ThreadMXBean rtb = ManagementFactory.getThreadMXBean();....

 
 
中の_.$MessageFormaterツールクラスメソッドです.org.slf 4 j.helpers.MessageFormaterを使用していますが、アップロードされていません.
 
テスト例の出力は以下の通りであり、t 1とt 2がデッドロックしていることがわかる.
2014-09-04 15:08:57.565
Full thread dump Java HotSpot(TM) 64-Bit Server VM Sun Microsystems Inc. 20.45-b01

deadlock #0:t1 - t2

"t2" with id 10,state:BLOCKED on java.lang.Object@3ea981ca owned by t1 ,blocked:2,waited:0
	com.skybility.ha.cmm.common.trace.DeadLock1.method2(DeadLock1.java:22)
	- locked java.lang.Object@6d9efb05
	com.skybility.ha.cmm.common.trace.DeadLock1$Thread2.run(DeadLock1.java:50)

"t1" with id 9,state:BLOCKED on java.lang.Object@6d9efb05 owned by t2 ,blocked:3,waited:0
	com.skybility.ha.cmm.common.trace.DeadLock1.method1(DeadLock1.java:12)
	- locked java.lang.Object@3ea981ca
	com.skybility.ha.cmm.common.trace.DeadLock1$Thread1.run(DeadLock1.java:36)

"Attach Listener" with id 5,state: RUNNABLE,blocked:0,waited:0

"Signal Dispatcher" with id 4,state: RUNNABLE,blocked:0,waited:0

"Finalizer" with id 3,state:WAITING on java.lang.ref.ReferenceQueue$Lock@6a8814e9 ,blocked:0,waited:1
	java.lang.Object.wait(Native Method)
	java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
	java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
	java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

"Reference Handler" with id 2,state:WAITING on java.lang.ref.Reference$Lock@c1503a3 ,blocked:0,waited:1
	java.lang.Object.wait(Native Method)
	java.lang.Object.wait(Object.java:485)
	java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

"main" with id 1,state: RUNNABLE,blocked:0,waited:1
	sun.management.ThreadImpl.dumpThreads0(Native Method)
	sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:433)
	com.skybility.ha.cmm.common.ThreadDumper.dump(ThreadDumper.java:31)
	com.skybility.ha.cmm.common.trace.TestStackDump.main(TestStackDump.java:22)