SQL Stored Proc со временем ест память - PullRequest
1 голос
/ 28 сентября 2011

Я пытался диагностировать утечку памяти 30 МБ в этом веб-сервисе. Он имеет некоторую основную часть, полученную из SQL с использованием стандартных хранимых процедур Каждая «масса» возвращает около 10 000-50 000 строк. Веб-служба генерирует свой отчет и отправляет его вызывающей стороне.

Кажется, что каждый раз, когда вы вызываете этот отчет, 30 МБ памяти «съедается» и не освобождается. Так что, если вы нажмете на один и тот же вызов примерно 1000 раз, системе 3 ГБ не хватит памяти. Если вы перезапускаете пул приложений, мем освобождается. Вы можете сидеть там в течение дня, и мем не будет выпущен. Так что со временем веб-серверу не хватает памяти.

Я прошелся по коду, проанализировал его и, наконец, решил, что именно эти 3 "массовых" потока получают умеренный объем данных. Каждый занимает 10 МБ и не возвращает его после завершения. Сохраненные процы в порядке. Единственное, что странно в вызовах, это то, что он использует LINQ для вызова хранимых процедур и преобразования данных в объекты Poco, используя файл карты XML.

Я попытался изменить его, чтобы они использовали новый DataContext при каждом вызове хранимого процесса, а затем установили для DataContext значение null. Я попытался установить для всех типов объектов значение null, а затем вызвать GC.Collect, а mem все еще используется и не освобождается, пока вы не перезапустите пул приложений.

Буду признателен за любые выводы. Я подозреваю, что это как-то связано с LINQ и возвратом больших данных.

1 Ответ

4 голосов
/ 28 сентября 2011

Это неприятная сторона сбора мусора: разработчики склонны думать, что им больше не нужно беспокоиться об освобождении памяти.Но это не совсем так!

Некоторые экземпляры классов должны быть расположены (как это называется в .Net).Фактически, каждый объект, который реализует IDisposable, должен обрабатывать свой цикл памяти разработчиком.

Потоки являются хорошим примером.Потоки являются одноразовыми, и они обычно несут больший объем данных (больше, чем простая строка).Представьте себе сервис, в котором каждые 5 секунд вы обрабатываете поток объемом 2 КБ.Это не так много, правда?Это, скажем, маленький XML.Но что произойдет, если вы не избавитесь от этого?Ну, конечно, вы можете сделать математику самостоятельно, но я дам вам результат: ~ 33,7 МБ неиспользованного мусора.

Итог: избавьтесь от ваших одноразовых принадлежностей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...