GNU/Linux >> Linux の 問題 >  >> Linux

Javaプログラムをトレースするには?

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


Linux
  1. JVMデーモン?

  2. Linux – Javaプログラムをトレースする方法は?

  3. Ubuntu20.04をUbuntu21.04にアップグレードする方法

  1. trace.py を使用して Python スクリプトをトレースする方法

  2. Linuxでjvmに割り当てられたヒープサイズを確認する方法

  3. ウイルスによって実行されたアクションを追跡する方法は?

  1. 16進ダンプのしくみ

  2. Linux でプログラムがクラッシュする問題をどのように追跡できますか?

  3. コマンドのネットワーク アクティビティを追跡する方法は?