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