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