別の Java プロセスを実行するコンソールから実行する Java アプリケーションがあります。その子プロセスのスレッド/ヒープ ダンプを取得したい。
Unixではできましたkill -3 <pid>
が、Windowsの知る限り、スレッドダンプを取得する唯一の方法はコンソールでCtrl-Breakです。しかし、それは子プロセスではなく、親プロセスのダンプのみを提供します。
そのヒープダンプを取得する別の方法はありますか?
別の Java プロセスを実行するコンソールから実行する Java アプリケーションがあります。その子プロセスのスレッド/ヒープ ダンプを取得したい。
Unixではできましたkill -3 <pid>
が、Windowsの知る限り、スレッドダンプを取得する唯一の方法はコンソールでCtrl-Breakです。しかし、それは子プロセスではなく、親プロセスのダンプのみを提供します。
そのヒープダンプを取得する別の方法はありますか?
jmap
を知っていると仮定すると、実行中のプロセスのダンプを取得するために使用できますpid
。
タスク マネージャーまたはリソース モニターを使用して、pid
. それで
jmap -dump:format=b,file=heap.hprof <pid>
そのプロセスのヒープを取得します。
bash
とpgrep
がインストールされ、単一の Java プロセスが実行されているシステムの場合は、次を試してください。
jmap -dump:format=b,file=heap.hprof $(pgrep java)
前述のjconsole/visualvmを使用することに加えて、jstack -l <vm-id>
別のコマンドラインウィンドウで使用して、その出力をキャプチャすることができます。
<vm-id>は、タスクマネージャー(WindowsおよびUNIXのプロセスID)を使用するか、を使用して見つけることができますjps
。
jstack
とは両方とも、 jps
SunJDKバージョン6以降に含まれています。
JDK (jvisualvm.exe) と共に配布される Java VisualVM をお勧めします。動的に接続し、スレッドとヒープにアクセスできます。私は、いくつかの問題に対して非常に貴重であることを発見しました。
以下のオプションのいずれかを試してください。
32 ビット JVM の場合:
jmap -dump:format=b,file=<heap_dump_filename> <pid>
64 ビット JVM の場合 (明示的に引用):
jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
VM パラメーターで G1GC アルゴリズムを使用する 64 ビット JVM の場合 (ライブ オブジェクト ヒープのみが G1GC アルゴリズムで生成されます):
jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <pid>
関連する SE の質問: jmap コマンドでの Java ヒープ ダンプ エラー: 早期 EOF
jmap
この記事のさまざまなオプションをご覧ください
メモリ不足でヒープダンプが必要な場合は、オプションを使用して Java を起動できます。-XX:-HeapDumpOnOutOfMemoryError
kill -3 <pid>
Cygwin から送信できます。Cygwinps
オプションを使用して Windows プロセスを見つけ、そのプロセスにシグナルを送信する必要があります。
(Java 6 の SDK に含まれている) を実行jconsole
してから、Java アプリケーションに接続できます。実行中のすべてのスレッドとそのスタック トレースが表示されます。
2 番目の Java 実行可能ファイルから何らかのファイルに出力をリダイレクトする必要があります。次に、SendSignalを使用して "-3"を 2 番目のプロセスに送信します。
JDK 1.6 以降を使用している場合は、jmap
コマンドを使用して Java プロセスのヒープ ダンプを取得できます。条件として、ProcessID がわかっている必要があります。
Windows マシンを使用している場合は、タスク マネージャーを使用して PID を取得できます。Linux マシンの場合、アプリケーションに応じて、ps -A | grep java
または netstat -tupln | grep java
などのさまざまなコマンドを使用できます。top | grep java
jmap -dump:format=b,file=sample_heap_dump.hprof 1234
次に、1234 が PID であるようなコマンドを使用できます。
hprof ファイルの解釈に使用できるさまざまなツールがあります。使いやすい Oracle の visualvm ツールをお勧めします。