1. ホーム
  2. java

[解決済み] jmapの実行 ソケットファイルを開くことができない

2022-02-07 12:50:28

質問

を実行する必要がありました。 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分待っていますが、まだ終わりません。何か理由があるのでしょうか?

解決方法は?

jmap vs. jmap -F と同様に jstack vs. jstack -F は、ターゲットJVMと通信するために、全く異なるメカニズムを使用します。

jmap / jstack

を使わずに実行した場合 -F これらのツールは ダイナミックアタッチメカニズム . これは次のように動作します。

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

  2. 次に jmap 送る SIGQUIT をターゲットプロセスに送信します。JVMがシグナルをキャッチして .attach_pid1234 を起動します。 AttachListener のスレッドを作成します。

  3. AttachListener スレッドがUNIXドメインソケットを作成する /tmp/.java_pid1234 外部ツールからのコマンドを受け付ける。

  4. セキュリティ上の理由から jmap ) が受け入れられると、JVM はソケットピアのクレデンシャルが euidegid JVM プロセスの そのため jmap は、異なるユーザー(rootであっても)で実行された場合、動作しません。

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

  6. このコマンドを読み込んで実行するのは AttachListener のスレッドを使用する。すべての出力は、ソケットに送り返されます。ヒープダンプはJVMが直接インプロセスで行うので、動作は実に高速です。しかし、JVMがこれを行えるのは セーフポイント . セーフポイントに到達できない場合(例えば、プロセスがハングアップしている、応答がない、長いGCが進行中であるなど)。 jmap はタイムアウトして失敗します。

Dynamic Attachのメリットとデメリットをまとめてみましょう。

長所

  • ヒープダンプなどの処理をJVMで協調して最高速度で実行します。
  • の任意のバージョンを使用することができます。 jmap または jstack を使用して、他のバージョンのJVMに接続することができます。

短所

  • ツールは同じユーザーで実行する必要があります ( euid / egid ) をターゲットJVMとして使用します。
  • ライブで健康なJVMでのみ使用可能です。
  • で起動した場合は動作しません。 -XX:+DisableAttachMechanism .

jmap -F / jstack -F

で実行した場合 -F の機能を持つ特殊なモードに切り替わります。 HotSpot サービスアビリティエージェント . このモードでは、対象プロセスはフリーズし、ツールはOSのデバッグ機能を介してそのメモリを読み取る。 ptrace Linuxの場合

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

  2. このツールは、JVMメモリを読み込む際に PTRACE_PEEKDATA . ptrace は一度に1ワードしか読めないので、ターゲットプロセスの大きなヒープを読むためにあまりにも多くのコールが必要です。これは、非常に、非常に遅いです。

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

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

長所

  • ターゲットJVMの協力は不要です。ハングアップしたプロセスでも使用可能。
  • ptrace は、OSレベルの権限で十分な場合に動作します。例えば root は、他のすべてのユーザのプロセスをダンプすることができます。

短所

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

注意事項

強制モードでヒープダンプを取るには、より速い方法があります。まず、コアダンプを gcore を実行し、次に jmap を生成されたコアファイル上で実行します。参照 関連質問 .