web-dev-qa-db-ja.com

jmapを実行してソケットファイルを開けません

プロセスのヒープダンプを取得するには、jmapを実行する必要がありました。しかしjvmは戻りました:

Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

そこで、-Fを使用しました。

./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
  1. -Fを使用すると、ヒープダンプを取得しても問題ありませんか?
  2. 私は20分待っていますが、まだ終わっていません。なぜアイデアがありますか?
73
rayman

jmapjmap -F、およびjstackjstack -Fは、まったく異なるメカニズムを使用してターゲットJVMと通信します。

jmap/jstack

-Fなしで実行すると、これらのツールは ダイナミックアタッチメカニズム を使用します。これは次のように機能します。

  1. Javaプロセス1234に接続する前に、jmapは、ターゲットプロセスの作業ディレクトリまたは.attach_pid1234にファイル/tmpを作成します。

  2. 次に、jmapSIGQUITをターゲットプロセスに送信します。 JVMがシグナルをキャッチして.attach_pid1234を見つけると、AttachListenerスレッドを開始します。

  3. AttachListenerスレッドは、外部ツールからのコマンドをリッスンするUNIXドメインソケット/tmp/.Java_pid1234を作成します。

  4. jmapからの)接続が受け入れられるセキュリティ上の理由から、JVMはソケットピアの資格情報がJVMプロセスのeuidおよびegidと等しいことを確認します。そのため、jmapは、別のユーザー(rootでも)で実行すると機能しません。

  5. jmapはソケットに接続し、dumpheapコマンドを送信します。

  6. このコマンドは、JVMのAttachListenerスレッドによって読み取られて実行されます。すべての出力はソケットに送り返されます。ヒープダンプはJVMによってインプロセスで直接作成されるため、操作は非常に高速です。ただし、JVMは safepoints でのみこれを行うことができます。セーフポイントに到達できない場合(プロセスがハングする、応答しない、または長いGCが進行中)、jmapはタイムアウトして失敗します。

Dynamic Attachの利点と欠点をまとめましょう。

長所

  • ヒープダンプおよびその他の操作は、JVMによって最大速度で共同で実行されます。
  • jmapまたはjstackの任意のバージョンを使用して、JVMの他のバージョンに接続できます。

短所

  • このツールは、ターゲットJVMと同じユーザー(euid/egid)で実行する必要があります。
  • ライブで正常なJVMでのみ使用できます。
  • ターゲットJVMが-XX:+DisableAttachMechanismで起動されている場合は機能しません。

jmap -F/jstack -F

-Fを指定して実行すると、ツールは HotSpot Serviceability Agent を備えた特別なモードに切り替わります。このモードでは、ターゲットプロセスがフリーズします。ツールは、OSデバッグ機能、つまりLinuxでは ptrace を介してメモリを読み取ります。

  1. jmap -Fは、ターゲットJVMでPTRACE_ATTACHを呼び出します。 SIGSTOPシグナルに応じて、ターゲットプロセスは無条件に中断されます。

  2. ツールは、PTRACE_PEEKDATAを使用してJVMメモリを読み取ります。 ptraceは一度に1つのWordしか読み取ることができないため、ターゲットプロセスの大きなヒープを読み取るには呼び出しが多すぎます。これは非常に遅いです。

  3. このツールは、特定のJVMバージョンの知識に基づいてJVM内部構造を再構築します。 JVMのバージョンごとにメモリレイアウトが異なるため、-Fモードは、jmapがターゲットJavaプロセスと同じJDKからのものである場合にのみ機能します。

  4. ツールは、ヒープダンプ自体を作成し、ターゲットプロセスを再開します。

長所

  • ターゲットJVMからの協力は必要ありません。ハングしたプロセスでも使用できます。
  • ptraceは、OSレベルの特権で十分な場合に機能します。例えば。 rootは、他のすべてのユーザーのプロセスをダンプできます。

短所

  • 大きなヒープでは非常に遅い。
  • ツールとターゲットプロセスは同じバージョンのJDKからのものでなければなりません。
  • ツールが強制モードで接続されている場合、セーフポイントは保証されません。 jmapはすべての特殊なケースを処理しようとしますが、ターゲットJVMが一貫性のない状態になる場合があります。

強制モードでヒープダンプを取得するより高速な方法があります。最初に、 gcore でコアダンプを作成してから、生成されたコアファイルに対してjmapを実行します。 関連する質問 を参照してください。

147
apangin

私は、jmap(およびそれを使用してヒープダ​​ンプを生成する場合はおそらくjvisualvm)が、jmapを実行しているユーザーが、ダンプしようとしているプロセスを実行しているのと同じユーザーでなければならないことを強制することを発見しました。

私の場合、ヒープダンプが必要なjvmは、Linuxユーザー「jboss」によって実行されています。 Sudo jmap -dump:file.bin <pid>が「ソケットを開くことができません:」を報告していた場合、次を使用してヒープダ​​ンプを取得できました。

Sudo -u jboss jmap -dump:file.bin <pid>
75
ben_wing

ben_wing が言ったように、次のコマンドで実行できます:

Sudo -u jboss-as jmap -dump:file.bin <pid>

(私の場合、ユーザーはjboss-asですが、あなたはjbossまたは他のユーザーでもかまいません。)

ただし、パスワードの入力を求められたため[Sudo] password for ec2-user:)、パスワードの入力を求めずにSudoを実行できたため、十分ではありませんでした他のコマンドで。

私は解決策を見つけました here 、そして私は最初に別のSudoを追加する必要がありました:

Sudo sudo -u jboss-as jmap -dump:file.bin <pid>

jcmdjinfoなどの他のコマンドでも動作します。

1