デッドロックが起きているかもしれない、何気なく書かれている処理がスレッドのどこかでリソースもぐもぐしてるかもしれない、と不安に思ってスレッドダンプを取得する方法探したら、別途ツール使用する方法ばかりだったのでメモ。
1 2 3 4 5 6 7 8 9 10 11 12 |
StringBuilder builder = new StringBuilder(); Map<Thread,StackTraceElement[]> traces = Thread.getAllStackTraces(); for(Thread th : traces.keySet()){ StackTraceElement[] elem = traces.get(th); builder.append("------------"); builder.append("THREAD:" + th.getClass().getName()); for(StackTraceElement e : elem){ builder.append(e.toString()); builder.append("\n"); } } System.out.println(builder.toString()); |
builderに纏めてからprintlnしてますが、デバッグフラグが立っている時にloggerに投げるなりしてあげてください。
1 2 3 4 5 6 7 8 9 10 11 |
------------THREAD:java.lang.Threadjava.lang.Thread.dumpThreads(Native Method) java.lang.Thread.getAllStackTraces(Thread.java:1619) com.gumulab.test.Startup.main(Startup.java:18) ------------THREAD:java.lang.Thread------------THREAD:java.lang.ref.Reference$ReferenceHandlerjava.lang.Object.wait(Native Method) java.lang.Object.wait(Object.java:503) java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133) ------------THREAD:java.lang.ref.Finalizer$FinalizerThreadjava.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189) ------------THREAD:java.lang.Thread |
所々スタックトレースがなぜか空になってる部分がありますが、実運用で使う訳ではないでしょうしデバッグ時だけなので見逃してあげてます。嫌な人は弾いちゃってください。