Там может быть много причин для замедления со временем.Везде от медленной утечки памяти до антивируса.Лучшее, что вы можете сделать, - это попытаться собрать свидетельство (данные) о том, какую область приложения искать в первую очередь.Постарайтесь не обсуждать это со многими разработчиками, потому что у каждого будет другое мнение о том, что может быть не так.Получить данные!
Как получить данные:
perfmon perfmon - ваш друг.Есть много счетчиков, на которые вы можете посмотреть (как для всей системы, так и для конкретного процесса).Таким образом, вы можете начать с профилирования большой четверки (это память, использование диска, процессор и сеть).Есть много сообщений о том, какие счетчики лучше, поэтому я не буду вдаваться в подробности о счетчиках перфектов здесь.
windbg Если вы действительно видите, что память растет и не собирается, пришло время ввести большие пушки..NET отлично умеет абстрагировать использование памяти от разработчиков, но это означает, что нам иногда приходится заходить под .NET, чтобы выяснить, что не позволяет сборщику мусора выполнять свою работу. windbg с sos.dll (управляемые расширения) - отличный инструмент для этого.Самая сложная часть windbg (по моему опыту) - просто правильно загрузить расширения sos.Вы должны обратить пристальное внимание на то, какую целевую архитектуру (64 или 32) вы анализируете, и какую версию CLR вы используете.
procdump procdump от sysinternals - отличная маленькая утилита для получения снимков памяти из запущенного процесса.Эти моментальные снимки (файлы .dmp) можно затем проанализировать с помощью windbg.
sos Файл sos.dll поставляется с .NET Framework начиная с версии v2.В версии v4 Visual Studio 2010 интегрировал sos и позволяет анализировать файлы .dmp!
Команды sos для утечек памяти, которые я нашел наиболее полезными:
! Eeheap -gc (обзор того, что есть в каждом поколении каждой кучи)
! dumpheap -min <size>
(выдает все объекты и типы по определенному <size>
)
! Dumpheap -type <type>
(выгрузить все объекты определенного <type>
)
! Gcroot <address>
(печатьиз стека, чтобы вы могли видеть, какой родительский объект закрепляется в ГХ)
! do <address>
(распечатывает память определенного объекта)
Некоторые другие указатели:
Обычно вы хотите снимать память под нагрузкой, поэтому было бы неплохо иметь какой-то способ имитировать это извне системы.Таким образом, хорошо, если вы запустите этот процесс раньше времени и даже включите его в процесс QA для приложения.
Для проблем с производительностью обычно лучше делать регулярные снимки с течением времени с работающим приложением.Затем вы можете сравнить снимки при анализе.
Ну, это было немного дольше, чем я предполагал, но, надеюсь, оно того стоило!