WCF Web サービスに問題があり (ダンプ、メモリ リークなど)、プロフィル ツール (ANTS メモリ プロファイル) を実行しました。
処理が終了しても (特定のテストを実行してから停止しました)、ジェネレーション 2 は Web サービスのメモリの 25% であることがわかりました。このメモリを追跡して、ハッシュ コードが -1 の (null、null) アイテムでいっぱいの辞書オブジェクトがあることを発見しました。
Web サービスのワークフローは、特定の処理中に項目が追加され、辞書から削除されることを意味します (単純なAdd
andのみRemove
)。大したことではありません。しかし、すべての項目が削除された後、辞書は (null, null) でいっぱいになっているようですKeyValuePair
。実際、何千ものそれらがメモリの大部分を占有し、最終的にはオーバーフローが発生し、対応する強制アプリケーション プール リサイクルと DW20.exe が取得できるすべての CPU サイクルを取得します。
ディクショナリは実際にはDictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>>
( System.OutOfMemoryException が原因で Large Dictionary ) であるため、何かを保持する何らかの参照があるかどうかを既に確認しました。
ディクショナリは静的オブジェクトに含まれているため (処理を通じてさまざまな処理スレッドにアクセスできるようにするため)、この質問やその他の多くの質問 (静的メンバーはガベージ コレクションを取得しますか? ) から、そのディクショナリが第 2 世代にある理由がわかりました。しかし、これはそれらの原因も(null、null)?辞書からアイテムを削除しても、メモリ内で常に何かが占有されますか?
この質問のような速度の問題ではありませんC# の大きなデータ構造からメモリを解放します。メモリが再利用されることはないようです。
(null、null) ペアで埋め続けるだけでなく、実際に辞書からアイテムを削除するためにできることはありますか? 他にチェックアウトする必要があるものはありますか?