Анализ использования памяти с помощью средства выделения объектов .NET

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

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

Руководство по оптимизации кода см. в руководстве по улучшению производительности с помощью средства выделения объектов .NET.

Настройка

  1. Откройте профилировщик производительности (ALT+F2) в Visual Studio.

  2. Установите флажок .NET Object Allocation Tracking (Отслеживание выделения объектов .NET).

    Снимок экрана: выбранное средство отслеживания выделения объектов Dotnet.

    Снимок экрана: выбранное средство отслеживания выделения объектов Dotnet.

  3. Нажмите кнопку Пуск, чтобы запустить средство.

    Если вы включите параметр "Пуск с приостановленной коллекцией" перед запуском профилировщика, данные не будут собираться до нажатия кнопки "Запись " в представлении сеанса диагностики.

  4. После его запуска просмотрите сценарий, который вы хотите профилировать в приложении. Затем выберите Остановить сбор или закройте приложение, чтобы просмотреть данные.

    Снимок экрана: окно, в котором показана коллекция stop.

    Снимок экрана: окно, в котором показана коллекция stop.

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

    Снимок экрана: вкладка

    Снимок экрана: вкладка

Теперь вы можете проанализировать выделение памяти объектам.

Во время сбора средство отслеживания может замедлить работу профилированного приложения. Если производительность средства отслеживания или приложения замедлена и если не требуется отслеживать каждый объект, можно настроить частоту выборки. Для этого на странице сводки профилировщика рядом со средством отслеживания щелкните значок шестеренки.

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

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

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

Снимок экрана: скорректированная частота выборки.

Снимок экрана: скорректированная частота выборки.

Дополнительные сведения о том, как сделать средство более эффективным, см. в статье Оптимизация параметров профилировщика.

Расшифровка данных

В следующем графическом представлении на верхней диаграмме показано количество динамических объектов в приложении. На нижнем графе Object delta (Изменение объекта) показано процентное изменение объектов приложения. Красные столбцы обозначают, что была проведена сборка мусора.

Снимок экрана: граф для средства выделения Dotnet.

Снимок экрана: граф для средства выделения Dotnet.

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

Снимок экрана: отфильтрованный граф времени выделения Dotnet.

Снимок экрана: отфильтрованный граф времени выделения Dotnet.

Можно также увеличивать или уменьшать граф.

Распределение

В представлении Выделение показано местонахождение объектов, которым выделена память, и объем выделенной им памяти.

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

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

В представлении выделения отображаются следующие сведения:

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

  • В столбцеВыделения показано количество занимающих память объектов, относящихся к определенному типу выделения или функции. Этот столбец отображается только в представлениях Выделение, Дерево вызовов и Функции.

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

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

  • В столбце Имя модуля показан модуль, содержащий вызывающую функцию или процесс.

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

Символы

На вкладках Выделение, Дерево вызовов и Функции отображаются следующие символы:

  • Символ типа значения — тип значения, например целое число

  • Символ коллекции типа значения — коллекция типов значений, например массив целых чисел

  • Символ ссылочного типа — ссылочный тип, например строка

  • Символ коллекции ссылочного типа — коллекция ссылочных типов, например массив строк

Дерево вызовов

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

Снимок экрана: представление

Снимок экрана: представление

В представлении дерева вызовов отображаются следующие сведения:

  • В столбце Имя функции показан процесс или имя функции, содержащей объекты, для которых выделяется память. Отображение зависит от уровня проверяемого узла.
  • В столбцах Всего (выделения) и Общий размер (байты) отображается количество выделенных объектов и объем памяти, используемые функцией и всеми другими функциями, которые она вызывает. По умолчанию столбец total Size (Bytes) скрыт.
  • В столбцах Self (Allocations) (Собственные (выделения)) и Self-Size (Bytes) (Собственный размер (байт)) отображается количество выделенных объектов и объем памяти, используемый одной выбранной функцией или типом выделения.
  • В столбце Average Size (Bytes) (Средний размер (байт)) отображаются те же сведения, что и в представлении Выделения. Этот столбец по умолчанию скрыт.
  • В столбце Имя модуля показан модуль, содержащий вызывающую функцию или процесс.

Дополнительные параметры, которые отображаются в представлении "Дерево вызовов", включают:

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

Снимок экрана: развернутый горячий путь.

Снимок экрана: развернутый горячий путь.

Функции

В представлении Функции показаны процессы, модули и функции, для которых выделяется память.

Снимок экрана: представление

Снимок экрана: представление

Сведения, отображаемые в представлении "Функции ", включают:

  • В столбце Имя отображаются процессы в качестве узлов верхнего уровня. Под процессами располагаются модули, а под ними — функции.

  • В следующих столбцах отображаются те же сведения, что и в представлениях дерева выделения и вызова:

    • Всего (выделение)
    • Self (Allocations) (Собственные (выделения));
    • Общий размер (байт);
    • Self-Size (Bytes) (Собственный размер (байт));
    • Average Size (Bytes) (Средний размер (байт)).

Коллекция

В представлении Коллекция показано, сколько объектов было собрано или осталось во время сборки мусора.

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

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

В представлении коллекции отображаются следующие сведения.

  • В столбце GC показан идентификатор этой сборки мусора в жизненном цикле исполняемого файла.
  • В столбце "Поколение " показано создание сборки мусора.
  • В столбце типа GC отображается тип этой сборки мусора.
  • В столбце "Причина сборки мусора" показана причина этого события сборки мусора.
  • В столбце "Длительность приостановки" показано время, когда выполнение было заблокировано, так как сборщик мусора нуждается в эксклюзивном использовании кучи. Для фоновой сборки мусора это значение невелико.
  • В столбце "Размер loH" отображается размер кучи больших объектов после запуска сборщика мусора.
  • В столбце "Размер POH" отображается размер кучи закрепленных объектов после запуска сборщика мусора.
  • В столбце Surv (МБ) отображается количество МБ объектов, имеющих методы завершения (деструкторы), которые пережили сборку мусора.
  • В столбце закрепленных объектов отображается число закрепленных объектов, которые способствовали сборке мусора.
  • В столбце Собрано показано количество объектов, собранных сборщиком мусора.
  • В столбце Осталось показано количество объектов, сохранившихся после работы сборщика мусора.

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

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

Средства фильтрации

В каждом из представлений Выделения, Дерево вызовов и Функции есть параметры Показать только мой код и Show Native Code (Показать машинный код), а также поле фильтра.

  • Параметр Показать только мой код сворачивает системный код, код платформ и другой код, не написанный пользователем, во фреймы [Внешний код], чтобы можно было сосредоточиться только на пользовательском коде. Дополнительные сведения см. в статье Отладка пользовательского кода с использованием параметра "Только мой код".
  • Параметр Show Native Code (Показать машинный код) отображает машинный код целевого объекта анализа и может содержать код, не являющийся пользовательским.
  • Поле фильтра позволяет отфильтровать столбец Имя или Имя функции по указанному значению. Введите в поле строковое значение. Затем в таблице отобразятся только типы, содержащие эту строку.