У меня были некоторые проблемы с веб-службой 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)? Есть еще что мне нужно проверить?