指定はDictionary<T, U>
asp.netアプリケーションにあります。アプリケーションは長時間実行されており、新しい要素が辞書に継続的に追加されます。私の目標は、「メモリオーバーフロー」やその他の副作用なしに、できるだけ多くの要素を Dictionary に保持することです。古い要素を削除して、コレクションをクリーンアップして、新しい要素のためにメモリを解放するにはどうすればよいですか? 古い要素の数と、要素をいつ削除する必要があるかを確認する方法は?
3 に答える
マネージド言語を使用しているため、メモリを管理する方法が制限されており、手動でメモリを解放したり、ガベージ コレクターに強制的にメモリを解放したりする方法はすべて、最適ではないと見なされます。
そのため、一般的なディクショナリが保持できる要素の数と、まだ要求できるメモリの量を直接知る方法はありません。同時に、ディクショナリからいくつかの古い値を削除しても、使用可能なメモリがすぐに増加するわけではありません。
つまり、 GC.GetTotalMemoryを使用してアプリケーションに現在割り当てられているメモリを監視し続けることができます(オブジェクトが完全に管理可能である限り、たとえばアンマネージ コードやデータ ブロックが含まれていない場合)、それをアプリケーションで使用可能なシステム メモリの合計と比較できます。
または、 に入れるオブジェクトのサイズがわかっている場合は、指定されたサイズの新しいオブジェクトを作成できるかどうかを通知するMemoryFailPointDictionary<>
クラスの使用に興味があるかもしれないので、例外にぶつかることはありません。いくつかのリソースを解放する時間があります。OutOfMemory
最後に、ディクショナリをキャッシュとして使用している場合は、ASP.NET に組み込みのキャッシュ プロバイダーがいくつかあります。こちらからお読みください。キャッシュは、メモリ不足の場合に古いオブジェクトまたは古いオブジェクトを自動的に削除します。