Поделиться через


Анализ использования памяти в релизных сборках (C#, Visual Basic, C++, F#)

Средство использования памяти отслеживает, как ваше приложение использует память. Вы можете использовать инструмент для изучения реальных эффектов, связанных с памятью, в сценариях, которые вы активно разрабатываете в Visual Studio. Вы можете создавать подробные моментальные снимки состояний памяти приложения и сравнивать моментальные снимки, чтобы найти первопричины проблем с памятью. Инструмент анализа использования памяти поддерживается в приложениях .NET, ASP.NET, C++, или в смешанном режиме (.NET и нативном).

Средство использования памяти может запускать при выпуске или отладке сборок. В этой статье показано, как использовать инструмент использования памяти в профилировщике производительности Visual Studio , который рекомендуется для релизных сборок. Сведения о выборе оптимального средства анализа памяти для ваших потребностей см. в статье Выбор средства анализа памяти.

Для лучшего взаимодействия с этой документацией выберите предпочитаемый язык разработки или среду выполнения из списка в верхней части статьи.

Сеансы диагностики использования памяти

Запуск сеанса диагностики использования памяти:

  1. Откройте проект в Visual Studio.

    Средство использования памяти поддерживает приложения .NET, ASP.NET, C++, или смешанный режим (.NET и нативный).

  2. В меню отладки задайте конфигурацию решения для выпуска и выберите локальный отладчик Windows (или локальный компьютер) в качестве целевого объекта развертывания.

  3. В строке меню выберите Отладка>Профилировщик производительности.

  4. В разделе Доступные средствавыберите Использование памяти, а затем выберите Запуск.

    запустить сеанс диагностики использования памяти.

Мониторинг использования памяти

При запуске сеанса диагностики приложение запускается, а в окне средства диагностики отображается график использования памяти приложения.

Снимок экрана окна средств диагностики в профилировщике производительности Visual Studio, показывающий график временной шкалы использования памяти приложения.

График временной шкалы показывает колебания памяти при запуске приложения. Пики в графе обычно указывают на то, что некоторый код собирает или создает данные, а затем отменяет его при выполнении обработки. Большие пики указывают области, которые можно оптимизировать. Основной проблемой является рост потребления памяти, который не возвращается. Это может указывать на неэффективное использование памяти или даже утечку памяти.

Создание моментальных снимков состояний памяти приложения

Приложение использует большое количество объектов и может потребоваться сосредоточить анализ на одном сценарии. Или вы можете обнаружить проблемы с памятью, которые следует изучить. Моментальные снимки можно создавать во время диагностического сеанса для отслеживания использования памяти в определенных моментах. Перед появлением проблемы с памятью хорошо получить основной снимок состояния приложения. Вы можете создать еще один моментальный снимок после первого возникновения проблемы, а также дополнительные моментальные снимки, если можно повторить сценарий.

Чтобы собрать моментальные снимки, выберите Принять моментальный снимок, когда требуется записать данные памяти.

скриншот: сделать снимок.

Закрытие сеанса диагностики

Чтобы остановить сеанс мониторинга без создания отчета, просто закройте окно диагностики. Чтобы создать отчет после завершения сбора данных или создания моментальных снимков, выберите Остановить сбор.

снимок экрана остановки сбора.

снимок экрана остановки сбора.

Если у вас возникли проблемы со сбором или отображением данных, ознакомьтесь с устранением ошибок профилирования и решением проблем.

Отчеты об использовании памяти

После остановки сбора данных инструмент использования памяти останавливает приложение и отображает обзорную страницу использования памяти.

снимок экрана: страница обзора в средстве

снимок экрана: страница обзора в средстве

Моментальные снимки использования памяти

Числа в панелях моментальных снимков показывают количество объектов и объём байтов в памяти на момент создания каждого снимка, а также разницу между текущим и предыдущим снимками.

Номера — это ссылки, которые открывают подробные использование памяти представления отчетов в новых окнах Visual Studio. Детализированный отчет о моментальном снимке показывает типы и экземпляры в одном моментальном снимке. Отчет об отличиях моментальных снимков сравнивает типы и экземпляры в двух снимках.

снимок экрана с ссылками на просмотр снимков

Для C++ столбец с названием Объекты (Diff) называется Выделения (Diff).

Образ Описание
шаг 1 Общее количество объектов в памяти на момент создания моментального снимка. Выберите эту ссылку, чтобы отобразить отчет о подробностях моментального снимка, отсортированный по количеству типов экземпляров.
Шаг 2 Разница между общим количеством объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Выберите эту ссылку, чтобы отобразить отчет об отличиях в моментальных снимках, отсортированный по разнице в общем количестве экземпляров типов.
шаг 3 Общее количество байтов в памяти в момент создания моментального снимка. Выберите эту ссылку, чтобы отобразить отчет с подробностями о моментальном снимке, отсортированный по размеру экземпляров типа.
Шаг 4 Разница между общим размером объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Положительное число означает, что размер памяти этого моментального снимка больше предыдущего, а отрицательное число означает, что размер меньше. базовый означает, что моментальный снимок является первым в диагностическом сеансе. нет разницы означает, что разница равна нулю. Выберите эту ссылку, чтобы отобразить отчет о различиях моментальных снимков, отсортированный по разнице в общем размере экземпляров типов.

ссылки на представление моментальных снимков

Образ Описание
шаг 1 Общее количество байтов в памяти в момент создания моментального снимка. Выберите эту ссылку, чтобы отобразить отчет с подробностями о моментальном снимке, отсортированный по размеру экземпляров типа.
Шаг 2 Общее количество объектов в памяти на момент создания моментального снимка. Выберите эту ссылку, чтобы отобразить отчет о подробностях моментального снимка, отсортированный по количеству типов экземпляров.
шаг 3 Разница между общим размером объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Положительное число означает, что размер памяти этого моментального снимка больше предыдущего, а отрицательное число означает, что размер меньше. базовый означает, что моментальный снимок является первым в диагностическом сеансе. нет разницы означает, что разница равна нулю. Выберите эту ссылку, чтобы отобразить отчет о различиях моментальных снимков, отсортированный по разнице в общем размере экземпляров типов.
Шаг 4 Разница между общим количеством объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Щелкните по этой ссылке, чтобы отобразить отчет о различиях моментальных снимков. Перечень отсортирован по разнице в общем количестве экземпляров разных типов.

Отчеты управляемых типов

Выберите текущую ссылку ячейки объектов (Diff) в сводной таблице использования памяти.

снимок экрана отчета управляемого типа.

Заметка

Для кода .NET значок 'Просмотр экземпляров' (значок экземпляра в столбцетипа объекта) доступен только при использовании средства 'Использование памяти', интегрированного с отладчиком, или при открытии снимка кучи и выборе 'Отладка управляемой памяти'.

На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).

В дереве пути к корневому в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него. Дополнительные сведения об использовании путей в корневом дереве см. в статье Анализ горячего пути к корневому.

снимок экрана отчета об управляемом типе.

На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).

В дереве пути к корневому в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него.

В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.

снимок экрана отчета о ссылочных объектах.

В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.

снимок экрана отчета о ссылочных объектах.

Фильтры дерева отчетов

Многие типы в приложениях не требуют, чтобы разработчики исследовали проблемы с памятью. Фильтры отчетов моментальных снимков могут скрыть большинство этих типов в управляемой памяти и путях к корневым деревьям.

параметры сортировки и фильтрации

Параметры сортировки и фильтрации

  • Чтобы отфильтровать дерево по имени типа, введите имя в поле фильтра . Фильтр не чувствителен к регистру символов и распознает указанную строку в любой части названия типа.

  • Выберите Показать только мой код в раскрывающемся списке "Фильтр ", чтобы скрыть большинство случаев, созданных внешним кодом. Внешние типы относятся к компонентам операционной системы или платформы или создаются компилятором.

  • выберите свернуть небольшие объекты в раскрывающемся списке фильтра , чтобы скрыть типы, размер (байты) меньше 0,5 процента от общего объема памяти.

Отчеты встроенных типов

Выберите текущую ссылку выделения (Diff) или размер кучи (Diff) в сводной таблице использования памяти в окне средств диагностики .

Представление типов в показывает количество и размер типов в моментальном снимке.

  • Щелкните значок представления экземпляров рядом с выбранным типом, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.

    Представление экземпляров отображает каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в панели "Стек вызовов выделения". (Эта информация доступна только во время отладки.)

    снимок экрана: панель

  • Выберите значок экземпляров (значок экземпляра в столбце типа объекта) выбранного типа, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.

    Представление экземпляров отображает каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в панели "Стек вызовов выделения".

    скриншот представления

  • Выберите "Stacks", чтобы увидеть стек распределения для выбранного типа.

    снимок экрана отображения стеков.

  • В списке режиме представления выберите представления стека выделения для выбранного типа.

    снимок экрана представления стеков.

Аналитика использования памяти

Для управляемой памяти средство анализа памяти также предоставляет несколько мощных встроенных автоматизированных аналитических сведений. Выберите вкладку 'Аналитика' в отчетах управляемых типов; в ней отображаются применимые автоматические подсказки, такие как повторяющиеся строки, разреженные массивыи утечки обработчиков событий .

снимок экрана представления аналитических сведений в средстве использования памяти.

В разделе повторяющиеся строки отображается список строк, которые выделяются несколько раз в куче. Кроме того, в этом разделе показан общий объем пустой памяти, то есть (число экземпляров — 1) раз размер строки.

В разделе разреженных массивов показаны массивы, которые в основном заполнены нулевыми элементами, которые могут быть неэффективными с точки зрения производительности и использования памяти. Средство анализа памяти автоматически обнаруживает эти массивы и показывает, сколько памяти тратится из-за этих нулевых значений.

В разделе утечки обработчика событий, доступном в Visual Studio 2022 версии 17.9 ( предварительная версия 1), отображаются потенциальные утечки памяти, которые могут возникать, когда один объект подписывается на событие другого объекта. Если издатель события продолжает существовать после подписчика, подписчик также продолжает существовать, даже если на него больше нет других ссылок. Это может привести к утечкам памяти, когда неиспользуемая память не освобождается должным образом, что приводит к тому, что приложение будет использовать больше и больше памяти с течением времени.

Некоторые типы имеют поля, которые можно считывать, чтобы определить размер собственной памяти, которую они удерживают. На вкладке аналитики отображаются поддельные узлы собственной памяти в графе объектов, которые сохраняются родительскими объектами, чтобы пользовательский интерфейс распознал их и отображал их размер и эталонный граф.

снимок экрана встроенного представления в средстве анализа использования памяти.

Отчеты о разнице изменений

  • Выберите ссылку изменения в ячейке панели снимков на странице обзора использования памяти.

    снимок экрана: выбор ссылки на изменение в ячейке.

    снимок экрана: выбор ссылки на изменение в ячейке.

  • Выберите снимок в списке сравниваемого с централизованного или локального отчета.

    снимок экрана: выберите моментальный снимок из списка Сравнить с.

    снимок экрана: выберите моментальный снимок из списка

Отчет об изменении добавляет столбцы (помеченные (Diff)в базовый отчет, который показывает разницу между базовым значением моментального снимка и моментальным снимком сравнения. Вот как может выглядеть diff-отчет представления Native Type:

снимок экрана представления Diff собственных типов.

На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).