У меня были некоторые проблемы с веб-службой WCF (некоторые дампы, утечки памяти и т.д.), и я запускаю инструмент profillng (профили памяти ANTS).
Просто чтобы узнать, что даже с обработкой (я запускаю определенный тест, а затем остановился), Generation 2 составляет 25% от объема памяти для веб-службы. Я отследил эту память, чтобы найти, что у меня есть словарь, полный (нулевые, нулевые) элементы, с -1 хэш-кодом.
Рабочий процесс веб-службы подразумевает, что в течение определенных элементов обработки добавляются, а затем удаляются из словаря (просто Add и Remove). Не ахти какое дело. Но кажется, что после удаления всех элементов словарь заполнен (null, null) KeyValuePair s. Тысячи из них на самом деле, так что они занимают большую часть памяти и, в конечном итоге, происходит переполнение, причем соответствующий принудительный пул приложений и DW20.exe получают все циклы CPU, которые он может получить.
Словарь фактически Dictionary<SomeKeyType, IEnumerable<KeyValuePair<SomeOtherKeyType, SomeCustomType>>> (System.OutOfMemoryException из-за большого словаря), поэтому я уже проверил, есть ли какая-то ссылка, содержащая вещи.
Словарь содержится в статическом объекте (чтобы сделать его доступным для разных потоков обработки через обработку), поэтому из этого вопроса и многих других (Статические члены когда-либо собирают мусор?) Я понимаю, почему этот словарь находится в Generation 2. Но это также является причиной этих (null, null)? Даже если я удаляю элементы из словаря, что-то будет всегда занято в памяти?
Это не проблема скорости, как в этом вопросе Освободить память от больших структур данных в С#. Кажется, память никогда не восстанавливается.
Есть ли что-то, что я могу сделать, чтобы фактически удалить элементы из словаря, а не просто заполнять его парами (null, null)? Есть еще что мне нужно проверить?