4

メモリ消費に問題があるアプリケーションに取り組んでいます。ユーザーがアプリケーションで長時間クリックすると、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 がメモリを解放するのを妨げていると思いますが、何が原因かはまったくわかりません。

誰かが同じような経験をしたことがあり、手がかりはありますか?

よろしくお願いします

そして私

4

3 に答える 3

3

OutOfMemoryException時々嘘をつきます。「アンマネージ ハンドルを取得できません」という意味になることもありますが、必ずしも実際にはメモリに関連しているわけではありません。問題は、何かが失敗した理由を判断するのが難しい場合が多く、「メモリ不足」がおそらく妥当な推測であることです。

多くのものがすぐに処分されていないようです。それらを破棄すると、カスタム コードを呼び出して、損傷していないハンドルを積極的かつ積極的に解放することになります。

逆に、GC は主にメモリ不足によってトリガーされます。最近では、PC に大量のメモリが残っていても、管理されていないハンドルが不足することがあります。

于 2013-03-11T15:55:46.193 に答える
0

いろいろあるかもしれません

これは、私にとってメモリ不足を引き起こした奇妙なことの 1 つです。

セットで = 値をチェックし、そうであれば戻ります。

NotifyPropertyChanged への不要な呼び出しを探します。
public プロパティを介して ObservableCollection をロードしていて、複数の NotifyPropertyChanged をキューに入れていて、メモリ不足を引き起こしたケースがありました。
次に、プライベート変数をロードし、完了したら一度 NotifyPropertyChanged を呼び出し、メモリ不足を修正しました。

于 2013-03-11T16:09:44.730 に答える
0

MODEL-VIEW-VIEWMODEL (MVVM)では、特別なサードパーティの参照を使用している場合、明示的なコントロールとしてオブジェクトをクリーンアップできる可能性があります。object.Disposeおそらく、含める必要があるだけです object = null

MVVM Light で ViewModel をいつ破棄するか

于 2013-03-11T16:04:29.913 に答える