Обнаружение утечек памяти в ASP.NET
Моя команда разработчиков использует ASP.NET 3.5/4.0 прямо сейчас, а наши сайты работают на IIS 7.5. В последнее время у нас были проблемы (примерно раз в неделю), которые вызывают исключения из памяти в наших приложениях ASP.NET. "Решение" - это перезапуск пула приложений на нашем веб-сайте. Я говорю "Решение", потому что это вряд ли решение; это больше повязка, которая просто держит наш пул приложений в разумном состоянии. Мне кажется, что некоторые приложения или многие приложения вызывают утечку памяти, которая со временем нарастает и выдает исключение из памяти. Хотя я могу настроить IIS для периодического перезапуска пула приложений, я бы предпочел узнать, как я могу обнаружить утечки памяти, чтобы попытаться исправить программу, а не продолжать применять диапазоны. Существуют ли какие-либо инструменты, которые могут обнаруживать и регистрировать утечки памяти для приложений ASP.NET?
Кроме того, мы действительно начали больше видеть эту проблему, когда перешли на использование элементов управления Telerik RAD. У кого-то еще были проблемы, подобные этому, используя эти элементы управления?
Спасибо,
Аарон
Ответы
Ответ 1
Я ранее разместил это руководство в ответ на другой вопрос, но этот вопрос и мой ответ, похоже, были удалены. Это не для слабонервных:
- Установите средства отладки для Windows (доступны как часть Windows SDK) на сервере
-
Когда приложение работает некоторое время, используйте adplus для захвата дампа памяти процесса (полезно использовать что-то вроде Process Explorer, чтобы найти правильный идентификатор процесса для дампа):
ADPLUS -hang -p <process id> -o .
-
Это создаст каталог, содержащий дамп памяти. Теперь вы можете использовать windbg и открыть файл дампа (File → Open Crash Dump...)
-
Появляются радости неуправляемого кода. Но вы используете нечто вроде Son of Strike, которое понимает .NET-код, чтобы узнать, какие объекты выделены. Сначала вы загружаете SOS:
.loadby sos mscorwks
И затем вы попросите его изучить управляемую кучу:
!dumpheap -stat
Это обычно выводит тонну вывода, но есть два столбца, показывающих количество экземпляров и количество потребляемой памяти по типу. Некоторые типы, которые вы ожидаете увидеть много (например, String), но если, скажем, есть тысячи экземпляров одного из ваших собственных типов, вы можете каким-то образом протекать этими объектами. Один из тех, кто поймал меня в прошлом, - это связать обработчик событий в объекте со статическим событием в приложении - это событие затем имеет живую ссылку на каждый из этих объектов.
Я никогда не помню, как это работает, и обычно ссылаюсь на этот чит-лист для SOS
Tess Ferrandez имеет хороший блог, который иногда охватывает отладку .NET с помощью неуправляемых отладчиков
например. сообщение с последнего мая, в котором подробно описывается потенциальная проблема, если вы используете XmlSerializer
с конструктором, отличным от стандартного.
Ответ 2
Существует много профилей памяти.
Один популярный DotTrace, другой - память ANTS профилировщик, оба являются коммерческими предложениями.
Ответ 3
Вы можете перейти на очень низкий уровень, не заплатив за сторонний инструмент. Это не для слабонервных, хотя.
Начало работы: отладка связанных с памятью проблем в .NET-приложении с использованием WinDBG и SOS
Обнаружение утечки памяти с помощью Windbg
Ответ 4
Утечка памяти .Net для ASP будет ограничена тем, что сохраняется. Состояние приложения и, в меньшей степени, состояние сеанса.
Все, что работает в этих областях, проверяются первыми.
Кроме того, статические объекты в любом классе, особенно списки или что-то в этом роде.
Ответ 5
Вы также можете попробовать использовать веб-профайлер asp.net . Это бесплатный инструмент, который позволяет вам просматривать информацию, поскольку она хранится в памяти во время работы приложения.
Это позволяет анализировать кеш asp.net, просматривать все текущие сеансы и содержимое состояния приложения.