257

別の Java プロセスを実行するコンソールから実行する Java アプリケーションがあります。その子プロセスのスレッド/ヒープ ダンプを取得したい。

Unixではできましたkill -3 <pid>が、Windowsの知る限り、スレッドダンプを取得する唯一の方法はコンソールでCtrl-Breakです。しかし、それは子プロセスではなく、親プロセスのダンプのみを提供します。

そのヒープダンプを取得する別の方法はありますか?

4

20 に答える 20

428

jmapを知っていると仮定すると、実行中のプロセスのダンプを取得するために使用できますpid

タスク マネージャーまたはリソース モニターを使用して、pid. それで

jmap -dump:format=b,file=heap.hprof <pid>

そのプロセスのヒープを取得します。

bashpgrepがインストールされ、単一の Java プロセスが実行されているシステムの場合は、次を試してください。

jmap -dump:format=b,file=heap.hprof $(pgrep java)
于 2010-06-15T04:12:24.430 に答える
22

前述のjconsole/visualvmを使用することに加えて、jstack -l <vm-id>別のコマンドラインウィンドウで使用して、その出力をキャプチャすることができます。

<vm-id>は、タスクマネージャー(WindowsおよびUNIXのプロセスID)を使用するか、を使用して見つけることができますjps

jstackとは両方とも、 jpsSunJDKバージョン6以降に含まれています。

于 2009-11-29T17:46:04.897 に答える
19

JDK (jvisualvm.exe) と共に配布される Java VisualVM をお勧めします。動的に接続し、スレッドとヒープにアクセスできます。私は、いくつかの問題に対して非常に貴重であることを発見しました。

于 2009-01-02T19:25:54.630 に答える
17

以下のオプションのいずれかを試してください。

  1. 32 ビット JVM の場合:

    jmap -dump:format=b,file=<heap_dump_filename> <pid>
    
  2. 64 ビット JVM の場合 (明示的に引用):

    jmap -J-d64 -dump:format=b,file=<heap_dump_filename> <pid>
    
  3. VM パラメーターで G1GC アルゴリズムを使用する 64 ビット JVM の場合 (ライブ オブジェクト ヒープのみが G1GC アルゴリズムで生成されます):

    jmap -J-d64 -dump:live,format=b,file=<heap_dump_filename> <pid>
    

関連する SE の質問: jmap コマンドでの Java ヒープ ダンプ エラー: 早期 EOF

jmapこの記事のさまざまなオプションをご覧ください

于 2016-07-08T14:02:01.733 に答える
15

メモリ不足でヒープダンプが必要な場合は、オプションを使用して Java を起動できます。-XX:-HeapDumpOnOutOfMemoryError

cf JVM オプションのリファレンス ページ

于 2012-01-18T15:59:12.330 に答える
10

kill -3 <pid>Cygwin から送信できます。Cygwinpsオプションを使用して Windows プロセスを見つけ、そのプロセスにシグナルを送信する必要があります。

于 2009-01-02T18:19:51.907 に答える
9

(Java 6 の SDK に含まれている) を実行jconsoleしてから、Java アプリケーションに接続できます。実行中のすべてのスレッドとそのスタック トレースが表示されます。

于 2009-01-02T18:45:22.340 に答える
7

2 番目の Java 実行可能ファイルから何らかのファイルに出力をリダイレクトする必要があります。次に、SendSignalを使用して "-3"を 2 番目のプロセスに送信します。

于 2009-01-02T18:26:26.340 に答える
4

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 ツールをお勧めします。

于 2015-02-12T09:48:17.463 に答える