Анализ использования памяти в релизных сборках (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) в сводной таблице использования памяти.
Заметка
Для кода .NET значок 'Просмотр экземпляров' (типа объекта) доступен только при использовании средства 'Использование памяти', интегрированного с отладчиком, или при открытии снимка кучи и выборе 'Отладка управляемой памяти'.
На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).
В дереве пути к корневому в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него. Дополнительные сведения об использовании путей в корневом дереве см. в статье Анализ горячего пути к корневому.
На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).
В дереве пути к корневому в нижней области отображаются объекты, ссылающиеся на тип, выбранный в верхней области. Сборщик мусора .NET очищает память для объекта только в том случае, если был выпущен последний тип, ссылающийся на него.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
В дереве ссылочных типов отображаются ссылки, удерживаемые типом, выбранным в верхней области.
Фильтры дерева отчетов
Многие типы в приложениях не требуют, чтобы разработчики исследовали проблемы с памятью. Фильтры отчетов моментальных снимков могут скрыть большинство этих типов в управляемой памяти и путях к корневым деревьям.
Чтобы отфильтровать дерево по имени типа, введите имя в поле фильтра . Фильтр не чувствителен к регистру символов и распознает указанную строку в любой части названия типа. Выберите Показать только мой код в раскрывающемся списке "Фильтр ", чтобы скрыть большинство случаев, созданных внешним кодом. Внешние типы относятся к компонентам операционной системы или платформы или создаются компилятором.
выберите свернуть небольшие объекты в раскрывающемся списке фильтра, чтобы скрыть типы, размер (байты) меньше 0,5 процента от общего объема памяти.
Отчеты встроенных типов
Выберите текущую ссылку выделения
Представление типов в показывает количество и размер типов в моментальном снимке.
Щелкните значок представления экземпляров рядом с выбранным типом, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.
Представление экземпляров отображает каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в панели "Стек вызовов выделения". (Эта информация доступна только во время отладки.)
Выберите значок экземпляров () выбранного типа, чтобы отобразить сведения об объектах выбранного типа в моментальном снимке.
Представление экземпляров отображает каждый экземпляр выбранного типа. При выборе экземпляра отображается стек вызовов, который привел к созданию экземпляра, в панели "Стек вызовов выделения".
В списке режиме представления представления стека выделения для выбранного типа.выберите
Аналитика использования памяти
Для управляемой памяти средство анализа памяти также предоставляет несколько мощных встроенных автоматизированных аналитических сведений. Выберите вкладку 'Аналитика' в отчетах управляемых типов; в ней отображаются применимые автоматические подсказки, такие как повторяющиеся строки, разреженные массивыи утечки обработчиков событий .
В разделе повторяющиеся строки отображается список строк, которые выделяются несколько раз в куче. Кроме того, в этом разделе показан общий объем пустой памяти, то есть (число экземпляров — 1) раз размер строки.
В разделе разреженных массивов показаны массивы, которые в основном заполнены нулевыми элементами, которые могут быть неэффективными с точки зрения производительности и использования памяти. Средство анализа памяти автоматически обнаруживает эти массивы и показывает, сколько памяти тратится из-за этих нулевых значений.
В разделе утечки обработчика событий, доступном в Visual Studio 2022 версии 17.9 ( предварительная версия 1), отображаются потенциальные утечки памяти, которые могут возникать, когда один объект подписывается на событие другого объекта. Если издатель события продолжает существовать после подписчика, подписчик также продолжает существовать, даже если на него больше нет других ссылок. Это может привести к утечкам памяти, когда неиспользуемая память не освобождается должным образом, что приводит к тому, что приложение будет использовать больше и больше памяти с течением времени.
Некоторые типы имеют поля, которые можно считывать, чтобы определить размер собственной памяти, которую они удерживают. На вкладке аналитики
Отчеты о разнице изменений
Выберите ссылку изменения в ячейке панели снимков на странице обзора использования памяти.
Выберите снимок в списке сравниваемого с централизованного или локального отчета.
Отчет об изменении добавляет столбцы (помеченные (Diff)в базовый отчет, который показывает разницу между базовым значением моментального снимка и моментальным снимком сравнения. Вот как может выглядеть diff-отчет представления Native Type:
На верхней панели показаны количество и размер типов в моментальном снимке, включая общий размер всех объектов, на которые ссылается тип (инклюзивный размер).