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


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

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

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

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

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

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

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

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

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

    Целевой объект развертывания обычно соответствует имени project, указывая локальное развертывание.

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

  1. На вкладке "Гибкий" выберите "Использование памяти" и нажмите кнопку "Пуск".

    Снимок экрана: параметр "Использование памяти" и кнопка "Пуск".

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

Заметка

Для некоторых типов project, таких как CMake, необходимо задать целевой объект запуска для Executable. Дополнительные сведения см. в разделе Какие инструменты поддерживаются для моего проекта?.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Скриншот страницы обзора в инструменте

Снимок экрана страницы обзора в инструменте

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

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

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

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

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

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

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

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

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

Заметка

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

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

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

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

Заметка

Для кода .NET значок View Instances (значок экземпляра в столбце "Тип объекта"DBG_MMA_InstancesIcon) доступен только при использовании интегрированного с отладчиком средства анализа использования памяти debugger-integrated Memory Usage tool или при открытии моментального снимка кучи heap snapshot и выбором Отладка управляемой памяти.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вид типов отображает количество и размер типов в снимке.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отчеты об изменении (Diff)

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

    Снимок экрана ссылки "Выберите изменение" в ячейке.

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

    Снимок экрана со списком «Сравнить с».

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

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

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

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

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