4

場合によってはシャットダウンする前にいくつかの情報を収集するグローバル例外処理を作成しています。この情報の1つは、現在のスレッドダンプです。私は次のコードでこれを行います:

ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);

問題は、TDAの分析可能な形式で情報を書き込むことです。自分でフォーマットを書く代わりに、情報をフォーマットする「簡単な」方法はありますか?

編集:問題のあるスレッドを見つけることができるように、完全なスレッドダンプが必要です。上記のメソッドはThreadInfo-Objectsの配列を提供するので、データがあります。私の問題は、書き込まれた出力がTDAがスレッドダンプとして認識する形式ではないことです。

4

3 に答える 3

3

TDA コード (結局のところ LGPL です) をコピーしたくない場合は、Attach API を使用して標準形式のデータを取得することもできます。私の知る限り、ダンプを実行する唯一の JVM 組み込みコードは、Attach エージェントのネイティブ コードです。

String selfName = ManagementFactory.getRuntimeMXBean().getName();
final int selfPid = Integer.valueOf(selfName.substring(0, selfName.indexOf('@')));                

HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(Integer.toString(selfPid));

InputStream sDump = vm.remoteDataDump(new Object[]{"-l"}); // lowercase L for lock dump

データ ダンプは、文字データのストリームでダンプを返します。

于 2010-05-04T15:12:00.883 に答える
1

TDA が JMX データをダンプするために使用するコードを使用するだけです: MBeanDumper.java

于 2010-04-07T13:55:48.823 に答える
0

Windowsを使用している場合、bwithersはJVMにスレッドダンプを通知する方法を説明しています。

純粋なJavaアプローチもありますが、出力が標準形式であるかどうかはわかりません。

于 2010-03-16T09:41:50.377 に答える