[解決済み] "メモリーリーク "の解剖学
質問
.NETの観点で。
- とは何ですか? メモリリーク ?
- アプリケーションがリークしているかどうかは、どのように判断すればよいのでしょうか?どのような影響があるのでしょうか?
- メモリリークを防ぐにはどうしたらよいですか?
- アプリケーションでメモリリークが発生した場合、そのプロセスが終了したり、強制終了されたりすると、メモリリークは解消されるのでしょうか?それとも、アプリケーションのメモリーリークは、プロセス終了後もシステム上の他のプロセスに影響を及ぼしますか?
- また、COM Interop や P/Invoke を介してアクセスされるアンマネージコードについてはどうでしょうか?
解決方法は?
私が見た中で一番良い解説は、無料の プログラミングの基礎」電子書籍 .
基本的には .NET メモリリークは、参照されているオブジェクトがルート化され、ガベージコレクションができなくなった場合に発生します。これは、意図した範囲を超えて参照を保持した場合に、偶然に発生します。
OutOfMemoryExceptionsが発生し始めたり、メモリ使用量が予想以上に増えたりすると、リークが発生していることがわかります( パフモン は素敵なメモリカウンターを備えています)。
理解する .NET のメモリモデルは、それを回避するための最良の方法です。具体的には、ガベージコレクタの仕組みと参照の仕組みを理解することです。また、よくある落とし穴として、おそらく最も一般的なのはイベントでしょう。もし、オブジェクト A のイベントに登録されています。 B であれば、オブジェクト A は、オブジェクト B が消えるのは B への参照を保持しています。 A . 解決策は、終了時にイベントの登録を解除することです。
もちろん、優れたメモリープロファイルを使えば、オブジェクトのグラフを見ることができ、オブジェクトのネストや参照を調べて、どこから参照されているのか、どのルートオブジェクトに責任があるのかを確認することができます ( 赤門蟻のプロファイル , JetBrains dotMemory, メムプロファイラ は本当に良い選択です。また、テキストのみの WinDbg と SOS しかし、あなたが本当の第一人者でない限り、私は市販/ビジュアル製品を強くお勧めします)。
共有参照がガベージコレクタによって管理されていることを除けば、管理されていないコードはその典型的なメモリリークの影響を受けると私は考えています。この点については、間違っているかもしれません。
関連
-
[解決済み] msiexec を使用せずにコマンドラインから MSI ファイルをアンインストールする
-
[解決済み] WCF エラーの解決。このサービスのメタデータパブリッシングは現在無効になっています。
-
[解決済み] Html.BeginForm()にCSSクラスを追加する。
-
[解決済み] VB.NETで線を引く方法
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] このコンピュータには、.NET Framework 4.6またはそれ以降の更新プログラムがすでにインストールされています。
-
[解決済み] 文字列から数字を抽出する正規表現
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] Microsoft.ACE.OLEDB.12.0' プロバイダがローカルマシンに登録されていません。
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンパイラーエラーメッセージ。コンパイラはエラーコード -532462766 で失敗しました。
-
[解決済み] msiexec を使用せずにコマンドラインから MSI ファイルをアンインストールする
-
[解決済み] ファイル *.mdf をデータベースとして添付できません。
-
[解決済み] VS2017/2015 で .xproj ファイルを開く方法
-
[解決済み] WPFで角丸ボタンを作成する/作るには?
-
[解決済み] LINQ to Entitiesはメソッドを認識しません。
-
[解決済み] 列挙型を文字列に変換する
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み] Microsoft.ACE.OLEDB.12.0' プロバイダがローカルマシンに登録されていません。
-
[解決済み] Javaメモリリークの見つけ方