18

jmapがメモリダンプを取得している間、Javaアプリケーションは実行を継続しますか?

4

3 に答える 3

14

本番マシンでこれを実行しようとすると、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)ファイルを圧縮して、さらに分析するためにマシンにコピーします。

于 2016-05-22T14:04:17.650 に答える
12

アプリケーションが停止します。正確なヒープダンプを取得する唯一の実用的な方法は、ダンプの作成中にすべてのアプリケーションアクティビティを停止することです。

これが「短い」一時停止であるか「長い」一時停止であるかは、ダンプされる量によって異なります。「-dump」を使用すると、到達不能なオブジェクトを含むヒープ全体がダンプされます。「-dump:live」を使用すると、到達可能なオブジェクトのみがダンプされます...ただし、到達可能なオブジェクトを特定するために、(少なくとも)ヒープにマークを付ける必要があります。

ただし、ギガバイトサイズのヒープをダンプする場合は、一時停止時間が秒単位ではなく分単位で測定されることを期待してください。


フォークを使用してJVMの停止を回避できるという提案を再確認すると、マルチスレッドプロセスのフォークが問題になる可能性があることがわかります。

次に、リソース使用量の問題があります。

于 2011-03-13T02:45:03.603 に答える
4

メモリダンプが取られている間、プログラムは一時停止すると思います。メモリダンプは実行中のプログラムのスナップショットであるため、jmapは、そのメモリが読み取られている間、JVMを短時間ロックする必要があります。ただし、ダンプファイルをクライアントに送り返すには、別のスレッドで実行できるため、一時停止を最小限に抑えることができます。

于 2011-03-13T02:58:26.257 に答える