Существует приложение, состоящее из трех исполняемых файлов. Один из них - диспетчер, который запускает другие исполняемые файлы. Диспетчер получает код от исполняемого файла при его завершении. То есть только диспетчер всегда работает, другие исполняемые файлы разгружаются и загружаются снова. Приложение работает в точке обслуживания и работает круглосуточно. При первом запуске приложение работает быстро. В конце концов приложение работает очень медленно. Что может быть причиной такого поведения?Длительное приложение замедляется
ответ
Могло быть много причин для замедления с течением времени. В любом месте от медленной утечки памяти до антивируса. Лучшее, что вы можете сделать, это попытаться построить доказательства (данные) о том, в какой области приложения смотреть в первую очередь. Старайтесь не говорить об этом со многими разработчиками, потому что у каждого будет другое мнение о том, что может быть неправильным. Получите данные!
Как получить данные:
perfmon Perfmon является вашим другом. Есть много счетчиков, на которые вы можете смотреть (как в системе, так и в зависимости от процесса). Таким образом, вы можете начать с профилирования большого 4 (это память, использование диска, процессор и сеть). Есть lot of posts, о том, какие счетчики являются лучшими, поэтому я не буду вдаваться в подробности о главных счетчиках здесь.
windbg Если вы действительно видите, что память растет и не собирается, пришло время ввести большие пушки. .NET отлично справляется с абстрагированием использования памяти от разработчиков, но это означает, что мы иногда должны подходить к .NET, чтобы выяснить, что не позволяет сборщику мусора выполнять свою работу. windbg с sos.dll (управляемые расширения) - отличный инструмент для этого. Самая сложная часть windbg (по моему опыту) - это просто увеличение загрузок sos. Вы должны обратить пристальное внимание на то, какую целевую архитектуру (64 или 32) вы анализируете и какую версию CLR вы используете.
procdump procdump by sysinternals - отличная утилита для получения моментальных снимков памяти из работающего процесса. Эти снимки (файлы .dmp) затем могут быть проанализированы с помощью windbg.
sos sos.dll поставляется с .NET Framework начиная с версии v2. С v4 Visual Studio 2010 интегрировал sos и позволяет анализировать файлы .dmp!
Команды СОС для утечки памяти, которые я нашел наиболее полезными:!
eeheap -gc (обзор того, что в каждом поколении каждой кучи)
dumpheap -min <size>
(свалки всех объектов и типов, более конкретный <size>
)
! dumpheap -типа <type>
(дамп всех объектов спа канцелярские товары <type>
)
!! Gcroot <address>
(распечатывает стек, так что вы можете увидеть, что родительский объект пиннинга в GC)
сделать <address>
(печатает память конкретного объекта)
Некоторые другие указатели:
Обычно вы хотите загрузить память под нагрузкой, поэтому было бы неплохо иметь способ имитировать это извне системы. Таким образом, хорошо запустить этот запуск заблаговременно и даже выполнить его в процессе QA для приложения.
Для проблем с производительностью обычно рекомендуется выполнять регулярные снимки с помощью запускаемого приложения. Затем вы можете сравнить моментальные снимки при анализе.
Ну, это было немного дольше, чем я предполагал, но, надеюсь, стоит того!
Удивительный ответ. Я добавлю, что мой первый выбор - просто настроить диспетчер задач и наблюдать за динамикой распределения ресурсов. – kenny
Но как может быть, что ресурсы не освобождаются, если exe прекращается? EXE завершают себя Application.Exit (int). Диспетчер - это только самое верхнее окно. Нет ничего, что могло бы привести к утечке памяти (я думаю). – EngineerSpock
@EngineerSpock Затем сначала измерьте ресурсы системного уровня (процессор, память, диск и сеть). Затем выясните, какой процесс вызывает всплеск в одном из них. Уточните свой поиск и начните заново. Это требует времени, но настойчивость, и вы найдете причину. –
Вам необходимо проверить использование памяти вашего приложения-диспетчера ... кажется, вы не используете неиспользуемые объекты.
Подписывание одного и того же события неоднократно делало это. Это всего лишь угадывание, если вы не используете отладчик. –