質問: 「メモリリーク」の解剖学 netパースペクティブでは メモリリークとは何ですか? アプリケーションがリークしているかどうかをどうやって判断できますか? 効果は何ですか? どうすればメモリリークを防ぐことができますか? アプリケーションにメモリリークがある場合、プロセスが終了するか強制終了されたときにそれが消えますか? それとも、アプリケーションのメモリリークは、プロセス完了後もシステム上の他のプロセスに影響を与えますか? そして、com相互運用機能やp / invokeを介してアクセスされるアンマネージドコードはどうでしょうか。
回答: 私が見た最も良い説明は、無料の programming of programming e-bookの第7章にあります。 基本的に、* .net *では、参照されているオブジェクトがルートであるためにメモリリークが発生するため、ガベージコレクトできません。 意図した範囲を超えた参照を握ると、これは偶然に起こります。 outofmemoryexceptionsが発生し始めたときや、メモリ使用量が予想以上に増えたときにリークが発生したことがわかります(* perfmon *には素晴らしいメモリカウンタがあります)。 それを避けるための最善の方法は、* .net のメモリモデルを理解することです。 具体的には、ガベージコレクタの仕組みと参照の仕組みを理解してください。ここでも、電子書籍の7章を参照してください。 また、よくある落とし穴、おそらく最も一般的な出来事に注意してください。 オブジェクト a がオブジェクト b のイベントに登録されている場合、 b は a への参照を保持しているため、オブジェクト a はオブジェクト b *が消えるまで動き続けます。 解決策は、完了したらイベントの登録を解除することです。 もちろん、優れたメモリプロファイルを使用すると、オブジェクトグラフを表示したり、オブジェクトのネスティング/参照を調べて、参照元の場所や責任を持つルートオブジェクトを確認できます(http://www.red-gate.com/products)。 /ants_memory_profiler/index.htm [red -gate ants profile]、jetbrains dotmemory、 memprofilerは本当に良い選択です、またはテキストのみの* windbg と sos *を使うこともできますが、あなたが本物の教祖でない限り、私はコマーシャル/ビジュアル製品を強くお勧めします。 私は、管理されていないコードは、共有参照がガベージコレクタによって管理されることを除いて、その典型的なメモリリークの影響を受けやすいと思います。 この最後の点について私は間違っているかもしれません。