Я пытался диагностировать утечку памяти 30 МБ в этом веб-сервисе. Он имеет некоторую основную часть, полученную из SQL с использованием стандартных хранимых процедур Каждая «масса» возвращает около 10 000-50 000 строк. Веб-служба генерирует свой отчет и отправляет его вызывающей стороне.
Кажется, что каждый раз, когда вы вызываете этот отчет, 30 МБ памяти «съедается» и не освобождается. Так что, если вы нажмете на один и тот же вызов примерно 1000 раз, системе 3 ГБ не хватит памяти. Если вы перезапускаете пул приложений, мем освобождается. Вы можете сидеть там в течение дня, и мем не будет выпущен. Так что со временем веб-серверу не хватает памяти.
Я прошелся по коду, проанализировал его и, наконец, решил, что именно эти 3 "массовых" потока получают умеренный объем данных. Каждый занимает 10 МБ и не возвращает его после завершения. Сохраненные процы в порядке. Единственное, что странно в вызовах, это то, что он использует LINQ для вызова хранимых процедур и преобразования данных в объекты Poco, используя файл карты XML.
Я попытался изменить его, чтобы они использовали новый DataContext при каждом вызове хранимого процесса, а затем установили для DataContext значение null. Я попытался установить для всех типов объектов значение null, а затем вызвать GC.Collect, а mem все еще используется и не освобождается, пока вы не перезапустите пул приложений.
Буду признателен за любые выводы. Я подозреваю, что это как-то связано с LINQ и возвратом больших данных.