Ответ 1
Запустите профилировщик кода.
Вот два хороших варианта:
Я считаю, что оба продукта имеют бесплатную пробную версию.
У меня есть большой веб-сайт, который, кажется, всасывает всю выделенную память. На этом сервере нет ничего другого на этом сайте. В течение недели он съедает 2 концерта и требует перезагрузки. В настоящее время это 32-разрядный сервер 2008 года с использованием IIS 7. Мы переустанавливаем 64-разрядную версию и добавляем больше памяти. Было бы неплохо отслеживать, где происходят утечки.
Итак, что лучше всего подходит для отслеживания утечек памяти?
Запустите профилировщик кода.
Вот два хороших варианта:
Я считаю, что оба продукта имеют бесплатную пробную версию.
Утечки памяти в .NET не так распространены, но когда они происходят, это чаще всего происходит из-за непривязанных обработчиков событий. Убедитесь, что вы отсоединили обработчики, прежде чем слушатели выйдут из сферы действия.
Другой вариант - если вы забыли позвонить Dispose()
в IDisposable
ресурсы. Это может предотвратить очистку неуправляемых ресурсов (которые не обрабатываются GC).
И еще одна возможная причина - тупиковый финализатор. Это предотвратит сбор всех оставшихся объектов в очереди финализатора.
Я использую WinDbg + Sos для отслеживания утечек. Шаги выглядят следующим образом
!gcroot
, чтобы узнать, что удерживает подозреваемых в жизни.Помните, что использование большой памяти также может быть связано с фрагментацией кучи. Регулярные кучи уплотняются, но закрепленные объекты могут вызвать фрагментацию. Кроме того, LOH не уплотняется, поэтому фрагментация не является редкостью для LOH.
Отличные учебники по WinDbg + sos здесь: http://blogs.msdn.com/tess/
Беги, не ходи, до Тесс Феррандез, Если он сломан, исправьте это, вы должны, который хорошо скриптовые лаборатории, посвященные обучению как диагностировать и отлаживать аварии, повесить и проблемы с памятью с помощью .NET-кода. она имеет некоторые из лучших материалов, которые я имею найденный на сегодняшний день, чтобы помочь вам начать работу.
Профилирование коммерческой памяти, например ANTS и SciTech - отличные ресурсы, которые покажут, какие объекты находятся в куче, и как они укоренены. Большинство коммерческих профилей памяти имеют возможность загружать "привязку" памяти к процессу (скажем, из рабочей среды).
Вы можете захватить "привязку" памяти (см. Snap v. Dump) с помощью adplus.vbs или DebugDiag. Adplus доступен как часть Инструменты отладки для Windows. DebugDiag также будет иметь некоторый рудиментарный анализ (но, кажется, более надежный по неуправляемому коду) автоматически.
Мониторинг приложения
Для получения информации о том, что отслеживать, см. Улучшение производительности и масштабируемости .NET, в частности глава 15.
Что касается мониторинга, для этого также доступны коммерческие инструменты, однако на каждой машине Windows также есть Perfmon.exe, который может использоваться для записи соответствующих счетчиков производительности.
Проверить приложение
Для получения информации о том, как выполнять тесты нагрузки или стресса, ознакомьтесь с паттернами и практиками Руководство по тестированию производительности для веб-приложений.
Отладка приложения
Как только вы определили, что у вас есть проблема (мониторинг) и ваша способность воспроизводить проблему (тестирование), вы можете перейти к отладке проблемы. См. Ссылки для Tess - эта информация будет нести вас долгий путь.
Затем промыть и повторить!:)
Удачи!
Z
В мониторе производительности добавьте счетчики для процессов /Private Bytes и .NET CLR Memory/# Bytes во всех кучах. Частные байты - это вся память, и память CLR управляется. Поэтому, если память CLR остается довольно ровной, но частные байты продолжают расти со временем, это означает, что утечка находится в неуправляемом ресурсе. Это обычно означает, что вы не распоряжаетесь собственными ресурсами должным образом. Хорошая вещь, на которую нужно смотреть, это такие вещи, как COM или IO (потоки и файлы). Убедитесь, что все эти вещи удалены, когда вы закончите с ним.
Вы можете попробовать использовать профилировщики, такие как dotTrace - установить его в трассировку памяти и запустить приложение.
Это должно дать вам подсказки, в которых собраны и области приложения, которые питаются слишком большим количеством памяти на ходу.
Это скорее предупреждение, а не обнаружение, но на уровне кода С# вы должны проверить, что любые классы, которые используют большие ресурсы, такие как изображения и другие файлы, правильно реализуют шаблон удаления. При необходимости вам также может потребоваться переопределить финализатор.
MSDN имеет хорошее руководство по этому вопросу.
Если у вас есть какие-либо классы в вашем приложении, которые, как вы знаете, используют большие ресурсы, это первые места для поиска проблем с памятью.
Я обнаружил, что EQATEC Profiler довольно хорош, плюс он бесплатный!
Зайдите в Лабораторию утечки памяти и памяти в этом сообщении в блоге:
Они могут помочь. В принципе, вы можете использовать WinDBG для анализа дампа памяти и определения того, что потребляет всю вашу память.
Мы использовали аналогичный подход, чтобы определить, что Regex пережевывает всю нашу память, но только тогда, когда продукт запускался на 64-битных машинах. Кривая обучения довольно крутая, но WinDBG - очень мощный инструмент.
Эта новая статья может быть полезна: Как обнаружить и избежать утечки памяти и ресурсов в приложениях .NET
Есть ли у вас какой-либо офисный подход? Если это так, убедитесь, что вы очищаете свои объекты приложения. Это один из возможных преступников.
Другой - это глобальные объекты, например, все, что статично.
У вас много динамических страниц на вашем сайте?
Вы также можете попробовать IBM Purify
Я предлагаю вам попробовать с небольшим набором динамических страниц, отключая пока все остальные. Я ненавижу говорить об этом, но очень возможно, что IIS 7 может также иметь утечки.
Посмотрите эту статью об обнаружении утечек памяти .NET приложений и связанных статьях, упомянутых в нижней части страницы, и, надеюсь, вы найдете решение или, по крайней мере, идея его решения.
Спасибо