Javaプログラムを追跡する方法は?

Javaプログラムを追跡する方法は?

システム管理者として、私は時々プログラムが予期せず動作しますが、エラーがまったく発生しないか、意味のないエラーメッセージを生成する状況に直面しています。

過去には(Java以前は)この問題を処理する2つの方法がありました。

  1. 何も役に立たない場合 - RTFM ;-)
  2. 1. 役に立たない場合 - システムコールを追跡し、何が起こっているかを確認します。

私は通常strace -fこの操作にLinuxを使用します(他のオペレーティングシステムにも同様のトレースツールがあります)。さて、これは一般的にすべての古いプログラムに適用されますが、Java-プロセス。実際の作業とは無関係に見えるシステムコールが多すぎるため、このダンプから検索するのは恐ろしいです。

これを行うより良い方法があります(ソースコードが利用できない場合)。

答え1

ckhanが述べたように、jstackJVMのすべてのアクティブスレッドの完全なスタックトレースを提供するので、素晴らしいです。 JVMのstderrでSIGQUITを使用して同じ結果を得ることができます。

別の有用なツールは、jmapプロセスのPIDを使用してJVMプロセスからヒープダンプを取得できることです。

jmap -dump:file=/tmp/heap.hprof $PID

visualvmこのヒープダンプは、jvisualvm(現在の標準のOracle Java SDKインストールの一部)などのツールにロードできます。また、VisualVMは、実行中のJVMに接続して内部CPU使用率、スレッド数、およびヒープ使用量を示すグラフなど、JVMに関する情報を表示できるため、リークトレースに最適です。

数値パラメータ(たとえば)で実行するときにvmstatjstatと同様に、一定期間にわたってJVMのガベージコレクション統計を収集できる別のツールです。vmstat 3

最後に、Javaプロキシを使用して、ロード時にすべてのオブジェクトのすべてのメソッドのインスツルメンテーションをプッシュできます。ライブラリを使用すると、javassistこれを簡単に実行できます。したがって、独自のトレースを追加することが可能です。難しい部分は、常にトレース出力を取得するのではなく、必要なときにのみトレース出力を取得する方法を見つけることです。これによりJVMの速度が遅くなる可能性があります。このように動作するプログラムがありますdtrace。私は試しましたが、それほど成功していませんでした。 JVMを起動するために必要なクラスはエージェントが検出する前にロードされ、そのクラスにインスツルメンテーションを追加するには遅すぎるため、エージェントはすべてのクラスを計測できません。

私のアドバイス- VisualVM から始めて、JVM の現在のスレッドと重要な統計を表示できるので、知っておくべきことを教えてください。

答え2

同様に、Linuxシステムで誤ったプログラムをデバッグするときは、同様のツールを使用してシステムで実行されているJVMをデバッグできます。

ツール #1 - jvmtop

と同様にtop使用できます。VMの上システムで実行されている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

別のオプションは、次のものを使用することです。仮想マシンモニタ。 JVM Monitorは、JavaアプリケーションのCPU、スレッド、およびメモリ使用量を監視するEclipseと統合されたJavaプロファイラーです。これを使用して、ローカルホストで実行されているJVMを自動的に検索したり、port @ hostを使用してリモートJVMに接続したりできます。

jvmmonitorのss

ツール #3 - Visualvm

ビジュアル仮想マシンJVMの問題をデバッグするときに使用する必要がある「ツール」かもしれません。機能セットは非常に深く、内部を非常に詳細に見ることができます。

アプリケーションパフォーマンス分析またはメモリ割り当て分析:

VisualVM#2用SS

スレッドダンプを取得して表示します。

VisualVM#3用SS

引用する

答え3

考えるjstack。あまり一致しませんstracepstack- シミュレートされていますが、少なくとも時間に合わせてスナップショット写真を提供します。必要に応じてまとめておおよそのトレースを取得します。

このSO記事のアドバイスも参照してください。https://stackoverflow.com/questions/1025681/call-trace-in-java

答え4

ぜひお試しください。ジャックゲーム、コードの変更や再配布なしでメソッドの開始と終了を追跡できるJVM追跡ツールです。

関連情報