
システム管理者として、私は時々プログラムが予期せず動作しますが、エラーがまったく発生しないか、意味のないエラーメッセージを生成する状況に直面しています。
過去には(Java以前は)この問題を処理する2つの方法がありました。
- 何も役に立たない場合 - RTFM ;-)
- 1. 役に立たない場合 - システムコールを追跡し、何が起こっているかを確認します。
私は通常strace -f
この操作にLinuxを使用します(他のオペレーティングシステムにも同様のトレースツールがあります)。さて、これは一般的にすべての古いプログラムに適用されますが、Java-プロセス。実際の作業とは無関係に見えるシステムコールが多すぎるため、このダンプから検索するのは恐ろしいです。
これを行うより良い方法があります(ソースコードが利用できない場合)。
答え1
ckhanが述べたように、jstack
JVMのすべてのアクティブスレッドの完全なスタックトレースを提供するので、素晴らしいです。 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に接続したりできます。
ツール #3 - Visualvm
ビジュアル仮想マシンJVMの問題をデバッグするときに使用する必要がある「ツール」かもしれません。機能セットは非常に深く、内部を非常に詳細に見ることができます。
アプリケーションパフォーマンス分析またはメモリ割り当て分析:
スレッドダンプを取得して表示します。
引用する
答え3
考えるjstack
。あまり一致しませんstrace
。pstack
- シミュレートされていますが、少なくとも時間に合わせてスナップショット写真を提供します。必要に応じてまとめておおよそのトレースを取得します。
このSO記事のアドバイスも参照してください。https://stackoverflow.com/questions/1025681/call-trace-in-java
答え4
ぜひお試しください。ジャックゲーム、コードの変更や再配布なしでメソッドの開始と終了を追跡できるJVM追跡ツールです。