ASP.NET приложение использует много памяти - утечка? - PullRequest
4 голосов
/ 02 марта 2010

У меня есть сайт ASP.NET, который, кажется, использует много памяти. Я оставил его на 7 часов в воскресенье, и он достиг 3,2 ГБ. Я думал, что .NET обрабатывает все свои собственные объекты сборки мусора / free'd и так далее, поэтому я не совсем уверен, с чего начать поиск решения.

Веб-сайт широко использует XML, поэтому я подумал, что это может быть проблемой, но я реализовал глобальное использование XMLSerializer, чтобы попытаться исключить это.

У меня также есть собственный обработчик, который обрабатывает все изображения, изменяет размеры, кэширует и затем загружает из кэша, где это возможно. Может ли это быть причиной каких-либо проблем?

Извините, что был настолько расплывчатым, но проблема в том, что я действительно не знаю, с чего начать. Любая помощь приветствуется.

Информация о сервере: .NET 2.0 Windows 2008 сервер IIS7

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 02 марта 2010

Лучшее место для начала - использование профилировщика. RedGate имеет ANTS Memory Profiler, который действительно хорош и имеет бесплатную пробную версию. Страница продукта здесь.

Вы запускаете приложение, подключаете профилировщик и начинаете использовать страницу как обычно. Профилировщик собирает информацию об используемых объектах, и это должно позволить вам точно определить причину проблемы.

Оказавшись в моем приложении, оказалось, что мы случайно создавали NHibernate SessionFactory для каждого запроса, который мы выполняли. На них все ссылались изнутри NHibernate, что означало, что они никогда не были освобождены в дополнение к ужасно медленным и неэффективным. Профилировщик приводит нас прямо к этому, и мы никогда не нашли бы это иначе.

2 голосов
/ 02 марта 2010

Альтернативой RedGate является использование adplus и WinDbg. Также читайте этот блог:

http://blogs.msdn.com/tess/

Это отличный источник справки по вопросам отладки.

Мой SysAdmin и я успешно использовали adplus и WinDbg для обнаружения утечки памяти в приложении ASP.NET. Моя ошибка разработчиков заключалась в том, что они случайно использовали кэш ASP.NET без истечения времени ожидания.

Еще одной ошибкой было то, что разработчик использовал перегрузки атрибутов с XMLSerialization. С этой функцией .net разрешает создавать новую сборку помощника сериализатора (что угодно). Сборки не могут быть выгружены, поэтому приложение кушает много памяти

1 голос
/ 17 февраля 2011

Вы говорите, что часто используете XmlSerializer. Это вызывает утечку памяти, если вы не используете конструкторы по умолчанию XmlSerializer (тип) и XmlSerializer (тип, defaultNameSpace).

См. эту статью MSDN для получения дополнительной информации

1 голос
/ 02 марта 2010

При работе с файловой системой очень важно, чтобы вы избавились от читателей и временных объектов.

...