web-dev-qa-db-ja.com

.hprofファイルからヒープデータを分析し、それを使用してメモリリークを減らす方法は?

最近、アプリケーションの実行中にJava.lang.OutOfMemoryError例外が発生しました。

そのような場合の1つで、jvisualvmを使用してヒープダ​​ンプを取得できました。

.hprof IDE)を使用して、ヒープダンプから取得したNetBeans 8.1ヒープダンプファイルを開くことができますが、データダンプの分析方法がわかりません。 dアプリケーションの観点から、ダンプファイルを読み取り、メモリ不足の例外を減らすための修正アクションを実行する方法を知りたい。

6
Anjan Baradwaj

JProfiler などのプロファイラーを使用したり、 このすばらしいビデオ で説明されている内容を適用したりするなど、メモリリークの根本原因を見つける方法はたくさんあります。 Eclipse Memory Analyzer別名 [〜#〜] mat [〜#〜] ヒープダンプを分析し、可能性を提案することもできます。 このビデオ でわかるように、メモリリークの原因(容疑者レポートここ に関する詳細情報を見つけることができます)。別の方法は、 このアプローチ を適用してJava Flight Recorderを使用することです。または、JVisualVMを使用して このビデオ で説明されているアプローチを使用します。

10
Nicolas Filotto

この場合に必要なツールは次のアプリです。

メモリアナライザツール

ダウンロードして開始し、hprofファイルをロードするだけです。 hprofのサイズによっては、1〜2分かかる場合がありますが、その後、メモリ使用量に関する優れた分析が表示されます。非常に使いやすく、潜在的なメモリリークを自動的に強調表示し、さまざまな角度からデータの分析を実行します。

私は重要なメモリの問題を扱っているときにのみMATを使用しており、覚えている限り、これらの問題をすべて解決しました。

1
Gergely Bacso

ほとんどの場合、知っておく必要があるのは、メモリをかみ砕くことで最も問題のあるクラスはどれかということだけです。実行中のプロセスに対してjmap-histoを使用できます。これは、大きなJVMの場合に便利です...大きなヒープダンプファイルをいじりたくない場合。プロセスを所有するのと同じLinuxユーザーとして実行する必要があるため、たとえば、 Linuxでは、次のものを使用できます。

Sudo -u <user> jmap -histo <pid>

明らかに、「histo」は「histogram」の略です。これにより、ヒストグラムがstdoutにダンプされるため、分析のためにヒストグラムをファイルにパイプすることをお勧めします。インスタンスの数*インスタンスのサイズで並べ替えられるので、上位10のエントリを見て、答えがあるかもしれません。

1
Tim Cooper

一般的に、基本的にあなたがしていることは「最もRAMを使用しているもの」を分析することですか?次に、それを理解したら(そして、「RAMが不足しているのはおそらく問題ですか?」)、なぜこれらのオブジェクトが非常に多くあるのかを理解しようとします。それらは、オブジェクトを保持しているが必要ではない何かによって参照されていますか?それとも、それは誤ってそれがすべきではない悪党の参照を保持していますか?使用しているアーキテクチャ/パラダイムが大きすぎませんか(例:「すべてを1つの大きな配列に格納する」)?データベースクライアントは、大きなResultSetを返す前にRAMにバッファリング」していますか?など...

0
rogerdpack