7

プログラムでスレッド ダンプを生成するのが好きです。基本的に2つの方法があることを学びました。

  1. 「Java 仮想マシン ツール インターフェイス」JVM-TI を使用する
  2. より高度に抽象化された「Java Debugger Interface」JDI を使用する

JVM-TI については、いくつかの有用な情報を見つけることができましたが、JNI-DLL を作成する必要があり、少なくとも当面は回避したいと考えています。JDI では Java を使用でき、アプリケーション内から使用できるようです。しかし、何らかのチュートリアルや HOWTO を見つけることができませんでした。私が見つけた唯一のドキュメントは Java-Docs http://java.sun.com/j2se/1.5.0/docs/guide/jpda/jdi/でした。このクラスの使い方。

それで、私が読むことができる良いチュートリアル/本を知っている人はいますか?

助けてくれてありがとう!

4

4 に答える 4

21

There is a third way: Thread.getAllStackTraces()

http://java.sun.com/javase/6/docs/api/java/lang/Thread.html#getAllStackTraces()

This is much easier than the debugger interface...

于 2008-10-27T15:07:25.627 に答える
8

http://java.sun.com/javase/6/docs/api/java/lang/management/ThreadMXBean.htmlから、デッドロックを含む必要なほぼすべてのスレッド情報を取得できます。

于 2009-03-27T18:53:16.750 に答える
3

Thread.getAllStackTraces() は、すべてのスレッドの実行トレースのみをダンプしますが、特定のスレッドによって取得されたオブジェクト ロックまたは特定のスレッドが待機しているロックの情報は提供しません。基本的に、これでデッドロックを突き止めることはできません。

于 2008-10-31T09:55:12.103 に答える
1

リモートの代替手段を検討しましたか? つまり、 VisualVM

visualVM を使用したスレッド ダンプ

jps と jstackも JDK 5 に含まれる便利なツールであり、現在のすべてのスレッドのスタック トレースを取得するためのコマンド ライン メソッドをすばやく提供します。

この記事は、JDI がリモート ツールとしても使用されることを示唆しています。

したがって、自分のプログラム内でスレッド ダンプをトリガーできるかどうかはわかりません。代わりに、Unix プラットフォームで SIGQUIT シグナル (kill -3) を自分自身に送信する方法を見つけるか、Unix で Ctrl-\ キーまたは Ctrl-Break を押します。 Windows プラットフォームで。

さらに、JDI は、JDI クライアントが実行されているのと同じプロセスをデバッグするために使用されることを意図していませんでした。それでも、リンクしたばかりのこのスレッドは、同じプログラム内で実際に JDI を使用することがわかっている最も近いスレッドです。

于 2008-10-27T11:54:31.240 に答える