メモリ消費に問題があるアプリケーションに取り組んでいます。ユーザーがアプリケーションで長時間クリックすると、OutOfMemoryException で終了します。
私は「ANTS Memory Profiler」を使ってかなり長い間アプリケーションのプロファイリングを行いましたが、私の意見では、「従来の」メモリ リークはありません (たとえば、オブジェクトがガベージ コレクションされるのを防ぐイベント ハンドラー)。
ただし、メモリ内に残るすべてのオブジェクトには、Finalizer を実装する標準の .NET コントロール (TextBox、Numberbox など) を直接的または間接的に使用するという共通点があります。「ANTS Memory Profiler Instance Retention Graph」では、コントロールへの参照を保持する唯一のインスタンスが .NET Finalizer Queue であることがわかります。
リテンション グラフをリンクします (画像を直接投稿するほどの評判はありません :-)) --> http://i50.tinypic.com/2d6r6nn.png
したがって、ファイナライザー スレッドのデッドロックの方向を調査しました ( http://dotnetdebug.ne t/2005/06/22/blocked-finalizer-thread/ を参照) が、デッドロックの兆候を見つけることができませんでした。また、デッドロック理論に反するのは、GC.Collect() をトリガーするメモリ プロファイラーを使用したメモリ スナップショットの後、ビューがガベージ コレクションされることです。それぞれのファイナライザーが実行され、すべて問題ありません。
これは、Finalizer を使用した .net オブジェクトの通常のライフサイクルのように見えますよね? しかし、私のアプリケーションでは、OutOfMemoryException が発生し、ガベージ コレクターが実行されなくなるまでクリックできます。
この問題を処理するための最後の試みは、GC.AddMemoryPressure() を使用することでした。ビューには、非常に多くのアンマネージ コードを割り当てる多くのビットマップがあるからです。しかし、これはガベージ コレクターに空きメモリを収集させることもできませんでした。
したがって、アプリケーションの概念に本質的に問題があり、GC がメモリを解放するのを妨げていると思いますが、何が原因かはまったくわかりません。
誰かが同じような経験をしたことがあり、手がかりはありますか?
よろしくお願いします
そして私