Я заметил похожее поведение при использовании пакета HTMLAgilityPack.
Я обнаружил, что когда один из данных приводит к пробелу локальных переменных в сгенерированных компилятором классах, которые начинают вызывать проблемы. Поскольку код недоступен, вот мой аптечка первой помощи.
- Убедитесь, что вы установили правильную стратегию , изменение стратегии сбора GC в app.config поможет фрагментации.
- Убедитесь, что вы обнуляете вещи, когда они вам не нужны, как только они вам не нужны, не ждите, пока область очистит вашу память, так как IEnumerables вызывается в вызывающем методе и области видимости переменных метода и может живи намного дольше чем ты думаешь! Откройте ваш код в ILSpy и посмотрите на сгенерированные классы <> d__0 (0) . Вы увидите такие вещи, как d __. X = X; в этом случае X может содержать фрагмент или целую страницу.
- Ваши локальные переменные перемещаются в кучу, так как они не доступны в итерациях IEnumable, если их там нет.
- Блокировка начинает становиться проблемой, у вашего барана 4-го поколения появляются большие предметы, которые фактически начнут блокировать ГХ. GC приостанавливает ваши потоки, чтобы иметь возможность выполнять сборку мусора.
Хуже всего то, что HTMLAgility - это фрагментов, которые в конечном итоге становятся реальной проблемой
Я совершенно уверен, что когда вы начнете рассматривать область действия своих фрагментов HTML, вы обнаружите, что все пойдет хорошо. Посмотрите на ваше выполнение, используя WinDbg в SOS , сделайте дамп памяти и посмотрите.
Как это сделать.
- открыть WinDebug, нажать F6 и прикрепить к процессу (введите идентификатор процесса в поле и нажмите ок)
затем загрузите выполнение в вашу память, введя
.loadby sos clr
затем введите
!dumpheap -stat
Затем вы получите элементы памяти, выделенные в вашем приложении, с адресом памяти и размером, сгруппированным по типу и отсортированным от низкого заголовка к высокому заголовку, вы увидите что-то вроде System.String [] с огромным числом перед это то, что вы хотели бы исследовать в первую очередь.
Теперь, чтобы узнать, у кого это есть, вы можете набрать
!dumpheap -mt <heap address>
И вы увидите адреса, которые используют эту таблицу памяти (MT) и размер оперативной памяти, которую она использует.
Теперь это становится интересным, вместо того, чтобы проходить строки кода x100, которые вы вводите
!gcroot <address>
то, что он напечатает, - это файл и строка кода, которые распределили память, класс, сгенерированный компилятором, и переменную, вызывающую ваше горе, а также байты, которые он содержит.
Это то, что можно назвать «производственной отладкой» и работает, если у вас есть доступ к серверу, который, я думаю, у вас есть.