Обычно, если у вас есть утечка в управляемом приложении, это означает, что что-то не собирается.К общим источникам относятся
Обработчики событий: Если подписчик не удален, издатель будет удерживать его.
Статика
Финализаторы: заблокированный финализатор не позволит потоку финализатора запускать любые другие финализаторы и, таким образом, предотвращает сбор этих экземпляров.
Аналогично, заблокированный поток будет удерживатьна каких корнях он держит.Конечно, если у вас есть заблокированные потоки, которые, вероятно, повлияют на приложение на нескольких уровнях.
Для устранения неполадок необходимо проверить управляемую кучу.WinDbg + SOS (или PSSCOR) позволит вам сделать это.Команда !dumpheap -stat
выводит список всей управляемой кучи.
Необходимо иметь представление о количестве экземпляров каждого типа, ожидаемых в куче.Как только вы найдете что-то странное, вы можете использовать команду !dumpheap -mt <METHOD TABLE>
для вывода списка всех экземпляров данного типа.
Следующим шагом является анализ корня этих экземпляров.Выберите один наугад и сделайте !gcroot
на этом.Это покажет, как этот конкретный экземпляр укоренен.Ищите обработчики событий и закрепленные объекты (обычно представляют статические ссылки).Если вы видите там очередь финализатора, вам нужно проверить, что делает поток финализатора.Для этого используйте команды !threads
и !clrstack
.
Если для этого экземпляра все выглядит нормально, переходите к другому экземпляру.Если это ничего не дает, возможно, вам придется вернуться, чтобы снова посмотреть на кучу и повторить оттуда.
Другие источники утечек включают: Сборки, которые не выгружены, и фрагментация кучи больших объектов.SOS / PSSCOR также может помочь вам найти их, но пока я пропущу детали.
Если вы хотите узнать больше, я рекомендую блог Тесс .Я также снял несколько видео о том, как использовать WinDbg + SOS ( здесь и здесь ).
Если у вас есть возможность отладки процесса во время его выполнения, я рекомендую использовать PSSCOR вместо SOS.PSSCOR - это, по сути, частная ветвь источников SOS, которая была дополнена дополнительными командами, а также улучшены многие из существующих команд SOS.Например, PSSCOR-версия команды !dumpheap
имеет очень полезный дельта-столбец, который значительно облегчает устранение утечек памяти.
Чтобы использовать его, вам нужно запустить процесс, подключить WinDbg, загрузить PSSCOR и выполнить !dumpheap -stat
.Затем вы позволяете процессу запускаться снова, чтобы распределение было выполнено.Прервите выполнение и повторите команду.Теперь PSSCOR покажет вам количество экземпляров, которые были добавлены / удалены со времени предыдущей проверки.