[解決済み] Javaメモリリークの見つけ方
質問
Javaで(例えばJHatを使って)メモリリークを見つけるにはどうしたらいいのでしょうか?私はJHatでヒープダンプをロードして、基本的なルックアップを試みました。しかし、私はルートリファレンスを見つけることができることになっている方法を理解していない ( レフ ) と呼ばれるものです。基本的に、数百メガバイトのハッシュテーブルのエントリ([java.util.HashMap$Entryとか)があることはわかるのですが、マップがあちこちに使われていて...。大きなマップを検索する方法、あるいは大きなオブジェクトツリーの一般的なルートを検索する方法はないでしょうか?
編集 OK、これまでの回答を読みましたが、私はケチな野郎だと言っておきましょう(JProfilerにお金を払うよりも、JHatの使い方を学びたいという意味です)。また、JHatはJDKの一部であるため、いつでも利用可能です。もちろん、ブルートフォース以外にJHatを使う方法がないのであれば話は別ですが、そんなことはあり得ないと思っています。
また、実際に修正する(ロギングを追加する)ことはできないと思います。 すべて マップサイズ)、リークに気付くのに十分な時間実行しました。
解決方法は?
私は、Javaのメモリリークを発見するために、次のような方法をとっています。私はjProfilerを使用して大きな成功を収めましたが、グラフ化機能(グラフィカルな形式で差分を分析するのが容易)を持つ任意の専門ツールが機能すると信じています。
- アプリケーションを起動し、すべての初期化が完了し、アプリケーションがアイドル状態になるまで、quot;stable" の状態になるまで待ちます。
- メモリリークが疑われる操作を数回実行し、キャッシュやDB関連の初期化を行わせる。
- GCを実行し、メモリスナップショットを取得します。
- 操作を再度実行します。操作の複雑さや処理されるデータの大きさによっては、操作を数回から数十回実行する必要がある場合があります。
- GCを実行し、メモリスナップショットを取得します。
- 2つのスナップショットに対してdiffを実行し、それを分析します。
基本的に解析は、例えばオブジェクトの種類による最大の正の差分から始まり、それらの余分なオブジェクトがメモリ上に固着する原因を見つける必要があります。
複数のスレッドでリクエストを処理するWebアプリケーションの場合、分析はより複雑になりますが、それでも一般的なアプローチは適用されます。
私は、アプリケーションのメモリフットプリントを削減することを目的としたプロジェクトを数多く手がけましたが、この一般的なアプローチにアプリケーション特有の微調整やトリックを加えることで、常にうまく機能しました。
関連
-
ファインバグタイプ
-
java 例外。Javaツールの初期化
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefinedeclipse エラー。この行に複数のアノテーションが見つかりました: - 文字列を型解決に解決できない
-
プロジェクトの依存関係を解決できなかった 解決
-
eclipseにプロジェクトをインポートした後、Editorにmain typeが含まれない問題
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
Javaエラーメッセージがenclosingクラスでない
-
javaでよく使われる英単語
-
[解決済み] "メモリーリーク "の解剖学