4

特定のクラスの実行中のインスタンスでハンドルを取得できるかどうか疑問に思っています。これを引き起こした特定の問題は、多数の実行中のスレッドが原因で適切に終了しないアプリケーションでした。

はい、スレッドをデーモン化できることはわかっています。そうすれば、スレッドはアプリケーションの終了を妨げません。しかし、これが可能かどうか疑問に思いました。私ができる最も近いのはクラスローダー(保護されています!)findLoadedClassですが、これを行うには独自のクラスローダーを実行する必要があります。

関連して、これはプロファイリング ツールがオブジェクト ハンドルを追跡する方法ですか? 独自のカスタムクラスローダーを実行することによって? または、私が見ていない素敵なトリッキーな方法はありますか?

4

5 に答える 5

3

このページから、

Java プロファイラーは、JVM へのネイティブ インターフェース (JVMPI for Java <=1.4.2 またはJVMTI for Java >=1.5.0 ) を使用して、実行中の Java アプリケーションからプロファイリング情報を取得します。

これは、プロファイラーに JVM へのフックを提供するSun 提供のネイティブ コードの一部に相当します。

于 2009-01-07T18:41:22.423 に答える
2

JVM の終了をブロックしているスレッドを見つけるために、実行中のアプリケーションの簡単なスタック トレースのみが必要な場合は、それに QUIT シグナルを送信できます。

$ kill -QUIT <pid of java process>

java.exeWindows では、(ではなくを使用して) コンソール ウィンドウでアプリケーションを実行する必要がありますjavaw.exe。その後、Ctrl-Pause を押してスタック ダンプを生成できます。どちらの場合も、標準出力に書き込まれます。

于 2009-01-07T19:35:40.580 に答える
1

Visual VMを使用して JVM を監視します。機能がたくさんありますので、ぜひお試しください。

于 2009-01-07T18:29:03.243 に答える
0

Java スレッド ダンプが必要だと思います。これにより、現在実行中のすべてのスレッドが一覧表示されます。私自身も同様の問題を抱えていましたが、スレッド ダンプが解決に役立ちました (Tomcat が終了したときに終了しなかった Quartz スケジューラ スレッド)。

于 2009-01-07T18:41:09.147 に答える