Измерение использования памяти в Visual Studio (C#, Visual Basic, C++, F#)
Найдите утечки памяти и неэффективную память при отладке с помощью средства диагностики использования памяти, интегрированного с отладчиком. Инструмент использования памяти позволяет создавать один или несколько моментальных снимков управляемой и нативной кучи памяти, чтобы понять влияние на использование памяти типов объектов. Вы также можете анализировать использование памяти без подключения отладчика или нацеливаясь на работающее приложение. Дополнительные сведения см. в разделе Запуск средств профилирования на выпущенных или отлаживаемых сборках. Сведения о выборе оптимального средства анализа памяти для ваших потребностей см. в статье Выбор средства анализа памяти.
Хотя вы можете собирать снимки состояния памяти в любое время в средстве использования памяти, вы можете использовать отладчик Visual Studio для управления выполнением вашего приложения для исследования проблем с производительностью. Настройка точек останова, пошаговое выполнение, остановка всего и другие действия отладчика могут помочь вам сосредоточиться на исследованиях производительности, сосредотачиваясь на наиболее важных участках кода. Выполнение этих действий во время работы приложения может исключить шум из кода, который не интересует вас, и может значительно сократить время, необходимое для диагностики проблемы.
Важный
Средства диагностики, интегрированные с отладчиком, поддерживаются для разработки .NET в Visual Studio, включая ASP.NET, ASP.NET Core, разработку машинного кода/C++ и приложения смешанного режима (.NET и собственные).
В этом руководстве описано следующее:
- Сделайте моментальные снимки памяти
- Анализ данных об использовании памяти
Если потребление памяти не предоставляет данные, которые вам нужны, другие средства профилирования в профилировщике производительности предоставляют различные типы сведений, которые могут быть вам полезны. Во многих случаях узкое место в производительности вашего приложения может быть вызвано чем-то другим, а не памятью, например, процессором, отрисовкой пользовательского интерфейса или временем выполнения сетевых запросов.
Заметка
поддержка настраиваемого распределителя профилировщик памяти в собственном коде работает путем сбора данных о событиях, создаваемых во время выполнения событий ET W. Распределители в CRT и пакете SDK для Windows были аннотированы на уровне исходного кода, чтобы их данные о выделении могли быть записаны. Если вы пишете собственные распределители, все функции, возвращающие указатель на только что выделенную кучу памяти, можно декорировать __declspec(распределитель), как показано в этом примере для myMalloc:
__declspec(allocator) void* myMalloc(size_t size)
Сбор данных об использовании памяти
Откройте проект, который необходимо отладить в Visual Studio, и установите точку останова в приложении в точке, в которой необходимо начать изучение использования памяти.
Если у вас есть область, в которой вы подозреваете проблему с памятью, установите первую точку останова перед тем, как возникнет проблема с памятью.
Совет
Поскольку может быть сложно записать профиль памяти операции, представляющей для вас интерес, когда приложение часто выделяет и отменяет выделение памяти, задайте точки останова в начале и конце операции (или пошагово пройдите операцию), чтобы найти точный момент, когда память изменилась.
Задайте вторую точку останова в конце функции или области кода, которую необходимо проанализировать (или после возникновения подозрительной проблемы с памятью).
Окно средств диагностики отображается автоматически, если вы его не отключили. Чтобы снова открыть окно, щелкните Отладка>Windows>Показать средства диагностики.
Выберите Использование памяти с настройкой Выбор инструментов на панели инструментов.
Щелкните Отладка и запуск отладки (Или Запустить на панели инструментов или F5).
Когда приложение завершит загрузку, появится представление сводки средств диагностики.
Заметка
Поскольку сбор данных памяти может повлиять на процесс отладки ваших собственных или смешанных приложений, моментальные снимки памяти по умолчанию отключены. Чтобы включить моментальные снимки в собственных или смешанных приложениях, запустите сеанс отладки (быстрая клавиша: F5). Когда появится окно средств диагностики
, перейдите на вкладку использование памяти , а затем выберитепрофилирование кучи .Остановить (сочетания клавиш: Shift+F5) и перезапустить отладку.
Заметка
Поскольку сбор данных памяти может повлиять на процесс отладки ваших собственных или смешанных приложений, моментальные снимки памяти по умолчанию отключены. Чтобы включить моментальные снимки в собственных или смешанных приложениях, запустите сеанс отладки (быстрая клавиша: F5). Когда появится окно средств диагностики
, перейдите на вкладку использование памяти , а затем выберитепрофилирование кучи .Остановить (сочетания клавиш: Shift+F5) и перезапустить отладку.
Чтобы сделать моментальный снимок в начале сеанса отладки, выберите Сделать моментальный снимок на панели инструментов сводки Использование памяти. (Это может помочь также установить здесь точку останова.)
Совет
Чтобы создать базовые показатели для сравнения памяти, рассмотрите возможность создания моментального снимка в начале сеанса отладки.
Запустите сценарий, который приведет к остановке на первой точке останова.
Когда отладчик приостановлен на первой точке останова, выберите Сделать снимок на панели инструментов Использование памяти.
Нажмите клавишу F5, чтобы запустить приложение до второй точки останова.
Теперь сделайте еще один моментальный снимок.
На этом этапе можно начать анализ данных.
Если у вас возникли проблемы со сбором или отображением данных, ознакомьтесь с разделом 'Устранение ошибок профилирования' и разделом'Устранение проблем'.
Анализ данных об использовании памяти
Строки сводной таблицы использования памяти содержат моментальные снимки, сделанные во время сеанса отладки, и содержат ссылки на более подробные представления.
Имя столбца зависит от выбранного в свойствах проекта режима отладки: .NET, родного или смешанного (как .NET, так и родного).
Столбец объектов (Diff) (.NET) или Выделения (Diff) (C++) отображает количество объектов в .NET или собственной памяти при создании моментального снимка.
В столбце размер кучи (Diff) отображается количество байтов в .NET и собственных кучах
При создании нескольких моментальных снимков ячейки сводной таблицы включают разницу в значении между соответствующим снимком строки и предыдущим моментальным снимком.
Чтобы проанализировать использование памяти, щелкните одну из ссылок, которые открывают подробный отчет об использовании памяти:
- Чтобы просмотреть сведения о разнице между текущим моментальным снимком и предыдущим моментальным снимком, выберите ссылку на изменения слева от стрелки (). Красная стрелка указывает на увеличение использования памяти, а зеленая стрелка указывает на уменьшение.
Совет
Чтобы быстрее выявлять проблемы с памятью, отчеты диффа сортируются по типам объектов, которые больше всего увеличили общее количество (нажмите на ссылку изменения в столбце объектов (Diff)), или которые увеличили общий размер кучи (нажмите на ссылку изменения в столбце размер кучи (Diff)).
Чтобы просмотреть подробности только выбранного снимка, щелкните по ссылке, не вносящей изменений.
Отчет отображается в отдельном окне.
Отчеты управляемых типов
Выберите текущую ссылку объектов (Diff) в ячейке сводной таблицы использования памяти.
Заметка
Для кода .NET значок представления экземпляров () доступен только при использовании инструмента отслеживания использования памяти , интегрированного с отладчиком, или при открытии моментального снимка кучи и выборе отладки управляемой памяти .
На верхней панели показаны количество и размер типов в срезе, включая размер всех объектов, на которые ссылается тип (инклюзивный размер).
В дереве Пути к корню в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него. Дополнительные сведения об использовании путей в корневом дереве см. в статье Анализ критического пути к корню.
На верхней панели показаны количество и размер типов в срезе, включая размер всех объектов, на которые ссылается тип (инклюзивный размер).
В дереве Пути к корню в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
Чтобы отобразить экземпляры выбранного типа в верхней области, щелкните значок представления экземпляров рядом с типом объекта.
В представлении отображаются экземпляры выбранного объекта в моментальном снимке на верхней панели. В области пути к корневым и ссылочным объектам отображаются объекты, ссылающиеся на выбранный экземпляр и типы, ссылающиеся на выбранный экземпляр. Когда отладчик остановлен в точке создания моментального снимка, вы можете навести указатель мыши на ячейку Значение, чтобы отобразить значения объекта в подсказке средства.
В представлении отображаются экземпляры выбранного объекта в моментальном снимке на верхней панели. В области пути к корневым и ссылочным объектам отображаются объекты, ссылающиеся на выбранный экземпляр и типы, ссылающиеся на выбранный экземпляр. Когда отладчик остановлен в точке создания моментального снимка, вы можете навести указатель мыши на ячейку Значение, чтобы отобразить значения объекта в подсказке средства.
Отчеты о встроенных типах
Выберите текущую ссылку для выделений (Diff) или размера кучи (Diff) в сводной таблице использования памяти окна средств диагностики.
Представление типов в отображает количество и размер типов в моментальном снимке.
Щелкните значок представления экземпляров рядом с выбранным типом, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.
В представлении экземпляров отображается каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в области стека вызовов выделения . (Эта информация доступна только во время отладки.)
Выберите значок экземпляров () для выбранного типа, чтобы отобразить информацию об объектах этого типа в снимке.
В представлении экземпляров отображается каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в области стека вызовов выделения .
В списке Режим представления выберите Вид стека, чтобы увидеть стек выделения для выбранного типа.
Аналитика использования памяти
Для управляемой памяти инструмент анализа памяти также предоставляет несколько мощных встроенных автоматических рекомендаций. Выберите вкладку Insights в отчетах управляемых типов, и в ней отображаются применимые автоматические аналитики, такие как повторяющиеся строки, разреженные массивыи утечки обработчика событий.
В разделе повторяющиеся строки отображается список строк, которые выделяются несколько раз в куче. Кроме того, в этом разделе показан общий объем пустой памяти, то есть (число экземпляров — 1) раз размер строки.
В разделе разреженных массивов показаны массивы, которые в основном заполнены нулевыми элементами, которые могут быть неэффективными с точки зрения производительности и использования памяти. Средство анализа памяти автоматически обнаруживает эти массивы и показывает, сколько памяти тратится из-за этих нулевых значений.
В разделе "Утечки обработчика событий", доступном в Visual Studio 2022 версии 17.9 Preview 1, отображаются потенциальные утечки памяти, которые могут возникать, когда один объект подписывается на событие другого объекта. Если публикатор события переживет подписчика, подписчик остается активным, даже если на него нет других ссылок. Это может привести к утечкам памяти, когда неиспользуемая память не освобождается должным образом, что приводит к тому, что приложение будет использовать больше и больше памяти с течением времени.
Как известно, некоторые типы имеют поля, которые можно считывать, чтобы определить размер памяти, которую они непосредственно удерживают. На вкладке аналитики
Отчёты об изменениях (Diff)
Выберите ссылку для изменения в ячейке сводной таблицы вкладки использования памяти в окне средств диагностики.
Выберите снимок состояния в списке сравнения с поддерживаемого или собственного отчета.
Отчет об изменении добавляет столбцы (помеченные как (Diff)) в базовый отчет, которые показывают разницу между базовым значением моментального снимка и моментальным снимком сравнения. Вот как может выглядеть отчет сравнения представления типа Native:
На верхней панели показаны количество и размер типов в срезе, включая размер всех объектов, на которые ссылается тип (инклюзивный размер).
Блоги и видео
Анализировать процессор и память при отладке
блог Visual C++: профилирование памяти в Visual C++ 2015
Дальнейшие действия
В этом руководстве вы узнали, как собирать и анализировать данные об использовании памяти. Если вы уже завершили обзор профилировщика, вы можете ознакомиться с общим подходом к оптимизации кода с помощью средств профилирования.
В этом руководстве вы узнали, как собирать и анализировать данные об использовании памяти во время отладки. Вы можете узнать больше об анализе использования памяти в релизных сборках с помощью профилировщика производительности.