Подтвердить что ты не робот

Обнаружение утечек памяти в ASP.NET

Моя команда разработчиков использует ASP.NET 3.5/4.0 прямо сейчас, а наши сайты работают на IIS 7.5. В последнее время у нас были проблемы (примерно раз в неделю), которые вызывают исключения из памяти в наших приложениях ASP.NET. "Решение" - это перезапуск пула приложений на нашем веб-сайте. Я говорю "Решение", потому что это вряд ли решение; это больше повязка, которая просто держит наш пул приложений в разумном состоянии. Мне кажется, что некоторые приложения или многие приложения вызывают утечку памяти, которая со временем нарастает и выдает исключение из памяти. Хотя я могу настроить IIS для периодического перезапуска пула приложений, я бы предпочел узнать, как я могу обнаружить утечки памяти, чтобы попытаться исправить программу, а не продолжать применять диапазоны. Существуют ли какие-либо инструменты, которые могут обнаруживать и регистрировать утечки памяти для приложений ASP.NET?

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

Спасибо,

Аарон

4b9b3361

Ответ 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 с конструктором, отличным от стандартного.

Ответ 4

Утечка памяти .Net для ASP будет ограничена тем, что сохраняется. Состояние приложения и, в меньшей степени, состояние сеанса.

Все, что работает в этих областях, проверяются первыми.

Кроме того, статические объекты в любом классе, особенно списки или что-то в этом роде.

Ответ 5

Вы также можете попробовать использовать веб-профайлер asp.net . Это бесплатный инструмент, который позволяет вам просматривать информацию, поскольку она хранится в памяти во время работы приложения.

Это позволяет анализировать кеш asp.net, просматривать все текущие сеансы и содержимое состояния приложения.