Jmapでうまく機能するヒープダンプを作成する必要があります。私の問題は、jmapがヒープダンプファイルを作成するのに非常に時間がかかることです。特にヒープが大きくなると(> 1GB)、時間がかかりすぎます。
例としての1つの状況:
サーバーでヒープスペースに問題が発生した場合、サーバーを自動的に再起動し、再起動する前にヒープダンプを作成したいと思います。これは機能しますが、ヒープダンプの作成に時間がかかりすぎます。このようにして、サーバーのダウン時間が長すぎます。ヒープダンプの作成には1時間以上かかります。
-XX:+HeapDumpOnOutOfMemoryError
については知っていますが、ほとんどの場合、jvmによって例外がスローされる前にメモリの問題を見つけることができます。
ヒープダンプをより速く書き込むjmapの代替手段はありますか?
上記の例の特別な解決策もありがたいです。
この質問はプログラミングとシステム管理の組み合わせですが、私はここで適切な場所にいると思います。
私は自分の質問に対する答えを見つけました。 this serverfaultに関する他の質問への回答が私にアイデアを与えました。
gdb --pid=<your Java pid>
gcore <file name>
detach
quit
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'.