Анализ использования памяти в релизных сборках (C#, Visual Basic, C++, F#)
Инструмент "Использование памяти" отслеживает использование памяти вашего приложения. Вы можете использовать средство для изучения в реальном времени влияния на память сценариев, которые вы активно разрабатываете в Visual Studio. Вы можете создавать подробные моментальные снимки состояний памяти приложения и сравнивать моментальные снимки, чтобы найти первопричины проблем с памятью. Средство использования памяти поддерживается в приложениях .NET, ASP.NET, C++, или в смешанном режиме (.NET и независимом коде).
Средство использования памяти может запускать в релизных или отладочных сборках. В этой статье рассматривается использование инструмента управления памятью в профилировщике производительности Visual Studio , рекомендуемого для выпускных сборок. Сведения о выборе оптимального средства анализа памяти для ваших потребностей см. в статье Выбор средства анализа памяти.
Для лучшего взаимодействия с этой документацией выберите предпочитаемый язык разработки или среду выполнения из списка в верхней части статьи.
Сеансы диагностики использования памяти
Запуск сеанса диагностики использования памяти:
Откройте проект в Visual Studio.
Средство использования памяти поддерживает приложения .NET, ASP.NET, C++, или смешанный режим (.NET и собственный).
В меню отладки задайте конфигурацию решения для выпуска и выберите локальный отладчик Windows (или локальный компьютер) в качестве целевого объекта развертывания.
В строке меню выберите Отладка>Профайлер производительности.
В разделе Доступные средствавыберите Использование памяти, а затем выберите Запустить.
Мониторинг использования памяти
При запуске сеанса диагностики ваше приложение запускается. В окне диагностические средства отображается график использования памяти вашего приложения.
График временной шкалы показывает колебания памяти при запуске приложения. Пики в графе обычно указывают на то, что некоторый код собирает или создает данные, а затем отменяет его при выполнении обработки. Большие пики указывают области, которые можно оптимизировать. Основной проблемой является рост потребления памяти, который не возвращается. Это может указывать на неэффективное использование памяти или даже утечку памяти.
Создание моментальных снимков состояний памяти приложения
Приложение использует большое количество объектов и может потребоваться сосредоточить анализ на одном сценарии. Кроме того, вы можете найти проблемы с памятью для изучения. Моментальные снимки можно создавать во время диагностического сеанса для отслеживания использования памяти в определенных моментах. Перед тем, как появится проблема с памятью, рекомендуется сделать базовый снимок приложения. Вы можете создать еще один моментальный снимок после того, как впервые возникнет проблема, а также сделать дополнительные снимки, если можно повторить сценарий.
Чтобы собрать моментальные снимки, выберите Сделать моментальный снимок, когда требуется записать данные памяти.
Закрытие сеанса диагностики
Чтобы остановить сеанс мониторинга без создания отчета, просто закройте окно диагностики. Чтобы создать отчет после завершения сбора данных или создания моментальных снимков, выберите Остановить сбор.
Если у вас возникли проблемы при сборе или отображении данных, ознакомьтесь с устранением ошибок профилирования и исправлением проблем.
Отчеты об использовании памяти
После остановки сбора данных средство использования памяти останавливает приложение и отображает страницу обзора использования памяти.
Снимки использования памяти
Числа на панелях моментальных снимков показывают количество объектов и байтов в памяти при создании каждого моментального снимка, а также разницу в данных между текущим и предыдущим снимками.
Номера — это ссылки, которые открывают подробные использование памяти представления отчетов в новых окнах Visual Studio. Отчет с подробными данными о моментальном снимке отображает типы и экземпляры в моментальном снимке. Отчет о различиях моментальных снимков сравнивает типы и экземпляры в двух моментальных снимках.
Для C++столбец объектов (Diff) называется выделения (Diff).
Образ | Описание |
---|---|
![]() |
Общее количество объектов в памяти при создании моментального снимка. Выберите эту ссылку, чтобы отобразить детальный отчет о моментальном снимке, отсортированный по количеству экземпляров типов данных. |
![]() |
Разница между общим количеством объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Выберите эту ссылку, чтобы отобразить отчет о разнице моментальных снимков, отсортированный по разнице в общем количестве случаев типов. |
![]() |
Общее количество байтов в памяти на момент, когда был сделан моментальный снимок. Выберите эту ссылку, чтобы отобразить отчет со сведениями о моментальном снимке, отсортированный по совокупному размеру экземпляров типа. |
![]() |
Разница между общим размером объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Положительное число означает, что объем памяти этого моментального снимка больше, чем у предыдущего, а отрицательное число означает, что объем меньше. Базовая линия означает, что это моментальный снимок, являющийся первым в диагностическом сеансе. нет разницы означает, что разница равна нулю. Выберите эту ссылку, чтобы показать отчет о различиях в моментальных снимках, отсортированный по разнице в общем размере экземпляров типов. |
Образ | Описание |
---|---|
![]() |
Общее количество байтов в памяти при создании моментального снимка. Выберите эту ссылку, чтобы просмотреть отчет с деталями о моментальном снимке, отсортированными по общему размеру экземпляров типа. |
![]() |
Общее количество объектов в памяти при создании снимка. Выберите эту ссылку, чтобы отобразить отчет о сведениях моментального снимка, отсортированный по количеству встречающихся типов. |
![]() |
Разница между общим размером объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Положительное число означает, что размер памяти этого моментального снимка больше предыдущего, а отрицательное число означает, что размер меньше. Эталонный означает, что снимок является первым в диагностическом сеансе. нет разницы означает, что разница равна нулю. Выберите эту ссылку, чтобы отобразить отчет о различиях моментальных снимков, упорядоченный по разнице в общем размере экземпляров типов. |
![]() |
Разница между общим количеством объектов памяти в этом моментальном снимке и предыдущим моментальным снимком. Выберите эту ссылку, чтобы отобразить отчет об различиях моментальных снимков. Он отсортирован по разнице в общем количестве типов. |
Отчёты по управляемым типам
Выберите текущую ссылку ячейки Объекты (Diff) в сводной таблице использования памяти.
Заметка
Для кода .NET значок представления экземпляров (типа объекта) доступен только при использовании средства об использовании памяти, интегрированного с отладчиком, или при открытии моментального снимка кучи и выбора отладки управляемой памяти.
На верхней панели отображаются количество и размер типов в моментальном снимке, включая полный размер всех объектов, на которые ссылается данный тип (полный размер).
В дереве "Пути к корню" в нижней области отображаются объекты, которые ссылаются на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него. Дополнительные сведения об использовании путей в корневом дереве см. в статье Анализ горячего пути к корневому.
На верхней панели отображаются число и размер типов на момент снимка, включая объём всех объектов, на которые ссылается данный тип (инклюзивный размер).
В дереве Пути к корню в нижней панели отображаются объекты, ссылающиеся на выбранный тип в верхней панели. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
Фильтры дерева отчетов
Многие типы в приложениях не нужны разработчикам для изучения проблем с памятью. Фильтры отчетов моментальных снимков могут скрыть большинство этих типов в деревьях управляемой памяти и путей к корням.
Чтобы отфильтровать дерево по имени типа, введите имя в поле фильтра. Фильтр не учитывает регистр и распознает указанную строку в любой части названия типа.
выберите показать только мой код в раскрывающемся списке "Фильтр ", чтобы скрыть большинство экземпляров, созданных внешним кодом. Внешние типы относятся к компонентам операционной системы или платформы или создаются компилятором.
выберите Свернуть небольшие объекты в выпадающем списке фильтра, чтобы скрыть типы, у которых размер (в байтах) составляет менее 0,5 процента от общего объема памяти.
Отчеты о встроенных типах
Выберите текущую ссылку выделения (Diff) или размер кучи (Diff) в сводной таблице использования памяти в окне средств диагностики.
Вид типов отображает количество и размер типов в снимке.
Щелкните значок просмотр экземпляров рядом с выбранным типом, чтобы отобразить сведения об объектах выбранного типа в снимке.
В представлении экземпляров отображается каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в области стека вызовов распределения. (Эта информация доступна только во время отладки.)
Выберите значок экземпляров (
) выбранного типа, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.
В представлении экземпляров отображается каждый экземпляр выбранного типа. При выборе экземпляра в области "Стек выделения вызовов" отображается стек вызовов, который привел к созданию экземпляра.
Выберите в списке режимов представления, чтобы увидеть стек выделения для выбранного типа.
Аналитика использования памяти
Для управляемой памяти средство анализа памяти также предоставляет несколько мощных встроенных автоматических сведений. Выберите вкладку Insights в отчетах управляемых типов, и в ней отображается применимая автоматическая аналитика, такая как повторяющиеся строки, разреженные массивыи утечки обработчиков событий .
В разделе повторяющиеся строки отображается список строк, которые выделяются несколько раз в куче. Кроме того, в этом разделе показан общий объем пустой памяти, то есть (число экземпляров — 1) раз размер строки.
В разделе разреженных массивов показаны массивы, которые в основном заполнены нулевыми элементами, которые могут быть неэффективными с точки зрения производительности и использования памяти. Средство анализа памяти автоматически обнаруживает эти массивы и показывает, сколько памяти тратится из-за этих нулевых значений.
В разделе утечки обработчика событий, доступном в Visual Studio 2022 версии 17.9 (предварительная версия 1), отображаются потенциальные утечки памяти, которые могут возникать, когда один объект подписывается на событие другого объекта. Если издатель события выходит из жизни подписчика, подписчик остается в живых, даже если к нему нет других ссылок. Это может привести к утечкам памяти, когда неиспользуемая память не освобождается должным образом, что приводит к тому, что приложение будет использовать больше и больше памяти с течением времени.
Некоторые типы имеют поля, которые можно считывать, чтобы определить размер собственной памяти, которую они удерживают. На вкладке аналитики отображаются поддельные узлы собственной памяти в графе объектов, которые сохраняются родительскими объектами, чтобы пользовательский интерфейс распознал их и отображал их размер и эталонный граф.
Отчеты об изменении (Diff)
Выберите ссылку на изменение в ячейке области моментальных снимков на странице обзора использования памяти.
Выберите снимок в списке сравнения с управляемого или локального отчета.
Отчет об изменениях добавляет столбцы (помеченные (Diff)) в базовый отчет, которые показывают разницу между значением базового моментального снимка и моментальным снимком для сравнения. Ниже показано, как может выглядеть отчет представления собственного типа:
На верхней панели показаны количество и размер типов в снимке состояния, включая размер всех объектов, на которые ссылается тип (инклюзивный размер).