jmap よりも高いパフォーマンスでヒープダンプを作成するための代替手段はありますか?

jmap よりも高いパフォーマンスでヒープダンプを作成するための代替手段はありますか?

jmap でうまく動作するヒープダンプを作成する必要があります。問題は、jmap がヒープダンプ ファイルを作成するのに非常に時間がかかることです。特にヒープが大きくなっている場合 (> 1GB)、時間がかかりすぎます。

例として、1 つの状況を挙げます。
サーバーがヒープスペースで問題を抱えた場合、サーバーを自動的に再起動し、再起動前にヒープダンプを作成します。この方法は機能しますが、ヒープダンプの書き込みに時間がかかりすぎます。この方法では、サーバーのダウン時間が長すぎます。ヒープダンプの作成には 1 時間以上かかります。

については知っています-XX:+HeapDumpOnOutOfMemoryErrorが、ほとんどの場合、JVM によって例外がスローされる前にメモリの問題を見つけることができます。

jmap に代わる、より高速にヒープダンプを書き込む方法はありますか?
上記の例に対する特別な解決策もいただければ幸いです。

この質問はプログラミングとシステム管理が混在していますが、ここが適切な場所だと思います。

答え1

私の質問に対する答えを見つけました。 これserverfault の別の質問への回答からアイデアを得ました。

  1. gdbを使用してJavaプロセスに接続する
    gdb --pid=<your java pid>
  2. gdbからコアダンプを作成する
    gcore <file name>
    detach
    quit
  3. Javaプロセスを再起動するか、好きなことをしてください
  4. jmapをコアダンプに接続して、コアダンプからヒープダンプを作成します。
    jmap -heap:format=b <path to java binary> <core dump file>

ステップ 4 では、正しい Java バイナリを指定することが重要です。そうしないと、jmap はコア ダンプにアタッチできません。Java プロセスにどのバイナリが使用されたか不明な場合は、gdb を使用してコア ダンプを開きます。
gdb --core=<core dump file>
次のような行があり、完全なパスが示されます。
Core was generated by '/opt/tomcat/bin/jsvc'.

コア ダンプを作成する方が、jmap 経由で直接ヒープダンプを作成するよりもはるかに高速です。この方法では、ダウンタイムをあまり長くせずに Java プロセスのヒープダンプを作成できます。

編集:
次のエラー メッセージが表示された場合、間違った Java バイナリを指定した可能性があります。

Error attaching to core file: Can't attach to the core file

jmap 呼び出しに適した Java バイナリを取得するには、gdb でコア ダンプを開きます。

gdb --core=[path tp core file]

正しいバイナリを示す次のような行が表示されます。

Core was generated by `/opt/tomcat/bin/jsvc'.

関連情報