ホームページ >Java >&#&チュートリアル >Javaがヒープダンプファイルを取得した後にそれを迅速に分析する方法
ヒープダンプ: ヒープダンプファイルは、特定の時点での JVM ヒープ内のオブジェクトの使用状況を保存するバイナリ ファイルです。 HeapDump ファイルは、指定された時点での Java スタックのスナップショットであり、イメージ ファイルの一種です。
ヒープ ダンプ (メモリ オーバーフロー) エラーは、通常、次の理由によって発生します。
1) JVM メモリが小さすぎる、
2) プログラムが厳密ではない、
3) ゴミが多すぎてリサイクルできない。
前回の OOM 問題を確認した結果、今週、別の Java サービスでメモリの問題が発生しました。今回の問題は深刻ではありません。ヒープ メモリ使用量が多いというアラームがトリガーされるだけです。 OOM はトリガーされませんでしたが、幸いなことにダンプ スクリプトは前回のレビューで要約されており、ヒープ使用率が高い場合に自動的に jstack と jmap を実行するため、問題のサイトを正常に保持できます。
ヒープダンプ ファイルを発見した後、すぐにそれをローカル マシンにコピーし、MAT を使用して次のように分析しました。
明らかに、いくつかのインターフェイスが非常に大きな String オブジェクトを割り当てているようです。String オブジェクトは約 200MB です。では、どこに割り当てられているのでしょうか?
ラージ オブジェクトに対応する割り当てスレッドは、次のように http-nio-8088-exec-6 であることが判明しました:
スレッド スタックの表示
ただし、スレッド スタックにビジネス コードが存在しない場合、どのインターフェイスに問題があるかを特定することはできません。 。 。
アクセスログ ログを確認する
今回の問題は、メモリの問題が極端ではないため、ある程度の運があれば、アクセスログから特定できます。このインターフェイスのリクエスト量が多い場合、複数の FGC が瞬時にトリガーされます。他のインターフェイスに影響を与えるだけでなく、速度も低下するため、どのインターフェイスが問題の原因であるかを判断できなくなります。
理論的には、Java ヒープ ファイルにはスレッド スタックとそのスレッド スタック上のパラメータが存在するはずだと思います。スレッドはオブジェクトでパラメータもオブジェクトであるため、それらはすべてヒープ内にあるはずです。空き時間に、MAT ツールを再び探索し始めました。
しばらく模索した結果、次のようなスレッド情報を表示するボタンを見つけました。
Find前述のスレッド http-nio-8088-exec-6 を展開すると、次のようにスレッド スタックとスタック上のパラメータが見つかります。リクエストの Request パラメータ オブジェクトを取得し、Request オブジェクトを複数回展開すると、次のようにインターフェイス URL 情報を見つけることができます。VisualVM View Thread Stack
多くの学生が VisualVM を使用してヒープダンプを分析することに慣れていることを考慮して、ここでは VisualVM の使用方法に関するチュートリアルも提供します。
次に、次のように、対応するオブジェクトを選択し、右クリックして [スレッドで選択] を選択します。
スレッド スタックを見つけた後、表示したいオブジェクトを見つけます。 Request オブジェクトをクリックして次のように入力します。
同様に、Request オブジェクトを展開すると、次のように URL 情報を見つけることができます。 :
以上がJavaがヒープダンプファイルを取得した後にそれを迅速に分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。