ホームページ >Java >&#&チュートリアル >Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

王林
王林転載
2023-05-13 20:58:042210ブラウズ

ヒープダンプファイルの紹介

ヒープダンプ: ヒープダンプファイルは、特定の時点での JVM ヒープ内のオブジェクトの使用状況を保存するバイナリ ファイルです。 HeapDump ファイルは、指定された時点での Java スタックのスナップショットであり、イメージ ファイルの一種です。

ヒープ ダンプ (メモリ オーバーフロー) エラーは、通常、次の理由によって発生します。

1) JVM メモリが小さすぎる、

2) プログラムが厳密ではない、

3) ゴミが多すぎてリサイクルできない。

はじめに

前回の OOM 問題を確認した結果、今週、別の Java サービスでメモリの問題が発生しました。今回の問題は深刻ではありません。ヒープ メモリ使用量が多いというアラームがトリガーされるだけです。 OOM はトリガーされませんでしたが、幸いなことにダンプ スクリプトは前回のレビューで要約されており、ヒープ使用率が高い場合に自動的に jstack と jmap を実行するため、問題のサイトを正常に保持できます。

ヒープ使用量の分布を確認する

ヒープダンプ ファイルを発見した後、すぐにそれをローカル マシンにコピーし、MAT を使用して次のように分析しました。

明らかに、いくつかのインターフェイスが非常に大きな String オブジェクトを割り当てているようです。String オブジェクトは約 200MB です。では、どこに割り当てられているのでしょうか? Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

ラージ オブジェクト割り当てスレッドを見つける

この割り当て動作は特定のスレッドによって実行される必要があり、そのスレッドは最も一般的な GC ルートであるため、必要なのは、そのスレッドの GC ルートを見つけることだけです。

ラージ オブジェクトに対応する割り当てスレッドは、次のように http-nio-8088-exec-6 であることが判明しました: Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

スレッド スタックの表示Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

このスレッドが何を行っているかを確認するにはどうすればよいですか? MAT でしばらく探してみましたが、関連するコンテンツが見つかりませんでした。ダンプ スクリプトに jstack が記録されていることを思い出しました。それを開いて、次のように見てください。

このスレッドでは json シリアル化を行っていることがわかりますが、しばらく注意深く検索しましたが、関連するインターフェイスのコントローラーが見つかりませんでした。これは、スレッドがコントローラー内のロジックの実行を終了してから戻ったためです。インターフェイスがデータに応答するときに割り当てられるラージ オブジェクト。

ただし、スレッド スタックにビジネス コードが存在しない場合、どのインターフェイスに問題があるかを特定することはできません。 。 。

アクセスログ ログを確認するJavaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

ラージ オブジェクトを割り当てるインターフェイスは間違いなく非常に遅いと考え、次のように Tomcat のアクセスログ ログを確認してみました。

## 最後に、問題のインターフェイスを見つけました。このインターフェイスは、製品データのクエリに使用されます。3 を入力すると、3 で始まるすべての製品がクエリされ、データは 200,000 個あります。問題は非常に単純です制限を追加するだけで完了です。

トラブルシューティングのプロセスを振り返る

しかし、私にはいつも習慣があります。それは、問題を解決した後、問題解決のプロセスにどれだけ運が関わっていたかを振り返ることです。

トラブルシューティングに関する技術記事をよく読むと、あるステップで突然問題の根本原因が特定される記事がたくさんあります。コードを見て、どこかに問題があると推測するか、このトラブルシューティングのプロセスにはかなりの運が関係していると思いますが、長年にわたる理論的基礎の蓄積と診断ツールの熟練した使用によって、問題が少しずつ発見されることを願っています。

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法今回の問題は、メモリの問題が極端ではないため、ある程度の運があれば、アクセスログから特定できます。このインターフェイスのリクエスト量が多い場合、複数の FGC が瞬時にトリガーされます。他のインターフェイスに影響を与えるだけでなく、速度も低下するため、どのインターフェイスが問題の原因であるかを判断できなくなります。

理論的には、Java ヒープ ファイルにはスレッド スタックとそのスレッド スタック上のパラメータが存在するはずだと思います。スレッドはオブジェクトでパラメータもオブジェクトであるため、それらはすべてヒープ内にあるはずです。空き時間に、MAT ツールを再び探索し始めました。

MAT View Thread Stack

しばらく模索した結果、次のようなスレッド情報を表示するボタンを見つけました。

Find前述のスレッド http-nio-8088-exec-6 を展開すると、次のようにスレッド スタックとスタック上のパラメータが見つかります。リクエストの Request パラメータ オブジェクトを取得し、Request オブジェクトを複数回展開すると、次のようにインターフェイス URL 情報を見つけることができます。

VisualVM View Thread Stack

多くの学生が VisualVM を使用してヒープダ​​ンプを分析することに慣れていることを考慮して、ここでは VisualVM の使用方法に関するチュートリアルも提供します。 Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

まず、次のようにヒープダンプ ファイルをロードします。

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

次に、次のように、対応するオブジェクトを選択し、右クリックして [スレッドで選択] を選択します。

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

スレッド スタックを見つけた後、表示したいオブジェクトを見つけます。 Request オブジェクトをクリックして次のように入力します。

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

同様に、Request オブジェクトを展開すると、次のように URL 情報を見つけることができます。 :

Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法

以上がJavaがヒープダンプファイルを取得した後にそれを迅速に分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。