ckhan が述べたように、 jstack
JVM 内のすべてのアクティブなスレッドの完全なスタック トレースが得られるため、優れています。 SIGQUIT を使用して、JVM の stderr で同じものを取得できます。
別の便利なツールは jmap
です プロセスの PID を使用して JVM プロセスからヒープ ダンプを取得できます。
jmap -dump:file=/tmp/heap.hprof $PID
このヒープ ダンプは、visualvm
などのツールで読み込むことができます。 (これは現在、jvisualvm という名前の標準の Oracle Java SDK インストールの一部です)。さらに、VisualVM は実行中の JVM に接続し、JVM に関する情報を表示できます。これには、内部 CPU 使用率、スレッド数、およびヒープ使用率のグラフを表示するなど、リークを追跡するのに最適です。
別のツール、jstat
は、数値引数 (例:vmstat 3
).
最後に、Java エージェントを使用して、ロード時にすべてのオブジェクトのすべてのメソッドにインストルメンテーションをプッシュすることができます。ライブラリ javassist
これを非常に簡単にするのに役立ちます。したがって、独自のトレースを追加することは可能です。その場合の難しい部分は、常にではなく、必要なときにのみトレース出力を取得する方法を見つけることです。これにより、JVM の速度が低下する可能性があります。 dtrace
というプログラムがあります それはこのような方法で動作します。私はそれを試しましたが、あまり成功しませんでした。エージェントがすべてのクラスを計測できるわけではないことに注意してください。JVM をブートストラップするために必要なクラスは、エージェントが計測する前に読み込まれ、それらのクラスに計測を追加するには遅すぎるためです。
私の提案 - VisualVM から始めて、現在のスレッドと JVM の重要な統計情報を表示できるので、知っておくべきことがわかるかどうかを確認してください。
Linux システムで失敗したプログラムをデバッグするときと同じ無駄ですが、同様のツールを使用して、システムで実行中の JVM をデバッグできます。
ツール #1 - jvmtop
top
に類似 、jvmtop を使用して、システムで実行中の JVM 内でどのクラスが実行されているかを確認できます。インストールしたら、次のように呼び出します:
$ jvmtop.sh
その出力は、同様にツール top
のようにスタイル設定されています。 :
JvmTop 0.8.0 alpha amd64 8 cpus, Linux 2.6.32-27, load avg 0.12
http://code.google.com/p/jvmtop
PID MAIN-CLASS HPCUR HPMAX NHCUR NHMAX CPU GC VM USERNAME #T DL
3370 rapperSimpleApp 165m 455m 109m 176m 0.12% 0.00% S6U37 web 21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager 11m 28m 23m 130m 0.00% 0.00% S6U37 web 31
19187 m.jvmtop.JvmTop 20m 3544m 13m 130m 0.93% 0.47% S6U37 web 20
16733 artup.Bootstrap 159m 455m 166m 304m 0.12% 0.00% S6U37 web 46
ツール #2 - jvmmonitor
もう 1 つの方法は、jvmmonitor を使用することです。 JVM Monitor は、Eclipse と統合された Java プロファイラーであり、Java アプリケーションの CPU、スレッド、およびメモリ使用量を監視します。これを使用して、localhost で実行中の JVM を自動的に検出するか、[email protected] を使用してリモート JVM に接続できます
ツール #3 - visualvm
visualvm はおそらく、JVM の問題をデバッグするときに使用する「ツール」です。その機能セットは非常に深く、内部を非常に深く見ることができます.
アプリケーションのパフォーマンスをプロファイリングするか、メモリ割り当てを分析します:
スレッド ダンプを取得して表示する:
参考文献
- visualvm チュートリアル
jstack
を検討してください .strace
とはまったく一致しません 、もっと pstack
-アナログですが、少なくともスナップショットの画像が表示されます。必要に応じて、それらをつなぎ合わせて粗いトレースを取得できます.
この SO 記事の提案も参照してください:https://stackoverflow.com/questions/1025681/call-trace-in-java