jmapがメモリダンプを取得している間、Javaアプリケーションは実行を継続しますか?
3 に答える
本番マシンでこれを実行しようとすると、jmapを使用してhprofファイルを作成するのに問題が発生し、JavaWebアプリケーションが何年もの間自然にロックされていました。
私はこのページを見つけました:
http://blogs.atlassian.com/2013/03/so-you-want-your-jvms-heap/
これは、gdb(Linuxシステムの場合)を使用してJavaプロセスのコアをダンプすることもできることを説明しています。
このコアファイルを使用すると、別のプロセスで分析するためのhprofファイルを生成できます。これにより、Javaサーバープロセスが長時間中断されるのを防ぐことができます。これは、jmapを使用して同じ操作を実行した場合に発生することです。
要約すると:
gdbをダウンロードしてインストールします
apt-get update
apt-get install gdb
..。
関心のあるJavaプロセスのJavaプロセスIDを取得します
jps..。
そのプロセスでgdbセッションを開始します
gdb[pid]..。
次に、コアファイルを生成します。
gcore /tmp/jvm.core
gdbセッションを終了します
デタッチ終了
次に、生成されたコアファイルを使用してhprofファイルを作成します。
sudo jmap -dump:format = b、file = jvm.hprof / usr / bin / java /tmp/jvm.core
次に、(g)ファイルを圧縮して、さらに分析するためにマシンにコピーします。
アプリケーションが停止します。正確なヒープダンプを取得する唯一の実用的な方法は、ダンプの作成中にすべてのアプリケーションアクティビティを停止することです。
これが「短い」一時停止であるか「長い」一時停止であるかは、ダンプされる量によって異なります。「-dump」を使用すると、到達不能なオブジェクトを含むヒープ全体がダンプされます。「-dump:live」を使用すると、到達可能なオブジェクトのみがダンプされます...ただし、到達可能なオブジェクトを特定するために、(少なくとも)ヒープにマークを付ける必要があります。
ただし、ギガバイトサイズのヒープをダンプする場合は、一時停止時間が秒単位ではなく分単位で測定されることを期待してください。
フォークを使用してJVMの停止を回避できるという提案を再確認すると、マルチスレッドプロセスのフォークが問題になる可能性があることがわかります。
- マルチスレッドプログラムのフォーク
- マルチスレッドフォーク
- http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them
次に、リソース使用量の問題があります。
メモリダンプが取られている間、プログラムは一時停止すると思います。メモリダンプは実行中のプログラムのスナップショットであるため、jmapは、そのメモリが読み取られている間、JVMを短時間ロックする必要があります。ただし、ダンプファイルをクライアントに送り返すには、別のスレッドで実行できるため、一時停止を最小限に抑えることができます。