Java では、ヒープ ダンプにより、特定の時点で Java 仮想マシンのメモリ内に存在するオブジェクト全体のスナップショットが得られます。ヒープ ダンプは、メモリ リークの問題のトラブルシューティングや、さまざまな Java アプリケーションでのメモリ使用量の最適化に役立ちます。アドレス、クラス名、タイプ、別のオブジェクトへの参照など、各インスタンスの詳細がヒープ ダンプに記録されます。ヒープ ダンプには、ポータブル ヒープ ダンプ形式、バイナリ形式、および ASCI テキストのクラシック形式など、2 つの形式があります。以下のセクションでは、ヒープ ダンプを生成するためのさまざまなツールとテクニックを見てみましょう。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
通常、このヒープ ダンプは、使用している Java アプリケーションが予想以上にメモリを消費しているか、アプリケーションが OutOfMemoryError でクラッシュした場合に使用されます。ヒープ ダンプを分析すると、異常の根本原因を特定するのに役立ちます。これに加えて、ヒープ ダンプを使用して、各クラスのメモリ使用量、各クラス内のオブジェクトの数などの詳細を特定することもできます。さらに、詳細をキャプチャすることができ、個人が使用するメモリの量も把握できます。アプリケーション内に存在するJavaオブジェクトも調べることができます。この情報は、メモリ リークの問題を引き起こす実際のコードを特定するのに役立ちます。
以下に挙げるツールとテクニックは次のとおりです
ヒープ ダンプは、JDK のさまざまなツールを使用してキャプチャできます。これらのツールは、JDK のホーム ディレクトリ内の bin フォルダーで利用できます。この場合、ディレクトリがシステム パスに存在するため、コマンド ラインを使用できます。
jmap は、実行中の JVM のメモリ統計を出力する、ローカルプロセスだけでなくリモートプロセスでも使用できるツールです。
jmap を使用してヒープ ダンプを生成するには、以下に示すようにダンプ オプションを使用できます。
jmap -dump:[live] , format = b , file=< path of the file > <process id>
jcmd は、コマンド リクエストを Java 仮想マシンに送信するツールです。さらに、これは Java プロセスが実行されているマシンに存在する必要があります。
ヒープ ダンプを取得するには、以下に示すように、コマンド GC.heap_dump を使用して、出力の PID とファイル パスを指定するだけで済みます。
jcmd < pid > GC.heap_dump < path of the file >
JVisualVM は、Java アプリケーションの監視、トラブルシューティング、プロファイリングを可能にする、シンプルで直感的なグラフィカル ユーザー インターフェイスを備えたツールです。これを使用してヒープ ダンプを生成するには、Java プロセスを右クリックし、「ヒープ ダンプ」オプションを選択する必要があります。これが完了すると、ツールはヒープ ダンプを作成し、新しいタブで開きます。
上記のような手動手法を使用する代わりに、コマンドライン オプション HeapDumpOnOutOfMemoryError を使用して、java.lang.OutOfMemoryError がスローされたときにヒープ ダンプを自動的に作成します。
java - XX:+HeapDumpOnOutOfMemoryError
java_pid
デフォルトのパスの代わりに、他のファイル パスを使用することもできます。そのためには、以下に示すように HeapDumpPath オプションを使用できます。
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=< file_path >
したがって、アプリケーションがこの方法を使用してメモリ停止を実行すると、ヒープ ダンプで構成される作成されたファイルでログを確認できます。
ここでは、2 つのパラメーターを許可する dumpHeap テクニックを生成する HotSpotDiagnostic MBean が使用されています。
それらは次のとおりです:
outputFile: 作成されたダンプのファイル パスです。ファイルの拡張子が hprof であることを確認してください。
live。jmap のものと似ています。これが設定されている場合、アクティブな参照を持つオブジェクトのみが印刷されます
ヒープ ダンプをキャプチャするためにこのメソッドを呼び出す 2 つの異なる手法を見てみましょう。
JConsole のような JMX クライアントは、HotSpotDiagnostic MBean を使用する最も簡単な方法です。 JConsole が開かれ、実行中の Java プロセスに接続されている場合は、「MBeans」タブに移動し、com.sun.management の下にある HotSpotDiagnostic を特定します。オペレーションの中に、前に説明した dumpHeap メソッドがあります。 dumpHeap 操作を実行する場合、パラメーター OutputFile および live を p0 および p1 テキスト フィールドとして使用します。
JConsole と同様に、HotSpotDiagnostic MBean は Java コードからプログラムを通じて呼び出すことで使用できます。そのためには、MBeanServer インスタンスがアプリケーションに登録された MBean を取得する必要があります。これが完了したら、HotSpotDiagnosticMXBean のインスタンスが必要になり、そのインスタンスの dumpHeap メソッドを呼び出す必要があります。
使用しているアプリケーションが IBM Websphere Application Server 上で実行されていると仮定します。管理コンソールはヒープを生成できます。まず、管理コンソールのナビゲーションペインで、「トラブルシューティング」を選択し、「Java ダンプとコア」を選択します。これが完了したら、ヒープ ダンプを作成する必要があるサーバーのサーバー名を選択します。その後、「ヒープ ダンプ」をクリックして、上記のサーバーのヒープ ダンプを作成します。 wsadmin はヒープ ダンプの作成にも使用できます。
以上がJava ヒープ ダンプの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。