web-dev-qa-db-ja.com

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

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

例としての1つの状況:
サーバーでヒープスペースに問題が発生した場合、サーバーを自動的に再起動し、再起動する前にヒープダンプを作成したいと思います。これは機能しますが、ヒープダンプの作成に時間がかかりすぎます。このようにして、サーバーのダウン時間が長すぎます。ヒープダンプの作成には1時間以上かかります。

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

ヒープダンプをより速く書き込むjmapの代替手段はありますか?
上記の例の特別な解決策もありがたいです。

この質問はプログラミングとシステム管理の組み合わせですが、私はここで適切な場所にいると思います。

5
Christian

私は自分の質問に対する答えを見つけました。 this 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'.
8
Christian