Средство анализа кучи (dotnet-gcdump)

Эта статья относится к: ✔️ dotnet-gcdump версии 3.1.57502 и более поздним версиям

Установка

Есть два способа загрузки и установки dotnet-gcdump:

  • Средство dotnet global:

    Чтобы установить последнюю версию dotnet-gcdumpпакета NuGet, используйте команду dotnet tool install.

    dotnet tool install --global dotnet-gcdump
    
  • Прямое скачивание:

    скачайте исполняемый файл средства, соответствующий вашей платформе:

    ОС Платформа
    Windows x86 x64 Arm64 Arm64 | | |
    Linux x64 Arm64 | | | musl-x64 musl-arm64 |

Примечание.

Для использования dotnet-gcdump в приложении x86 необходима соответствующая версия средства для архитектуры x86.

Краткие сведения

dotnet-gcdump [-h|--help] [--version] <command>

Description

Глобальное средство dotnet-gcdump собирает дампы сборщика мусора для активных процессов .NET с помощью EventPipe. Дампы сборщика мусора создаются путем его запуска в целевом процессе, включения специальных событий и повторного создания графа корней объектов из потока событий. Этот процесс позволяет собирать дампы сборщика мусора во время выполнения процесса и с минимальными издержками. Эти дампы могут быть полезны в нескольких сценариях.

  • Сравнение количества объектов в куче в нескольких моментах времени.
  • Анализ корней объектов (ответы на вопросы вида "что все еще содержит ссылку на этот тип?").
  • Сбор общей статистики о количестве объектов в куче.

Просмотр дампа сборщика мусора, захваченного с помощью dotnet-gcdump

В Windows файлы .gcdump можно просмотреть в PerfView для анализа или в Visual Studio. В настоящее время нет способа открытия .gcdump на платформах, отличных от Windows.

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

Параметры

  • --version

    Отображает версию программы dotnet-gcdump.

  • -h|--help

    Отображение справки в командной строке.

Команды

Команда
dotnet-gcdump collect
dotnet-gcdump ps
Отчет dotnet-gcdump

dotnet-gcdump collect

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

Предупреждение

Чтобы проанализировать кучу сборки мусора, эта команда запускает сборку мусора поколения 2 (полная), которая может временно приостановить выполнение среды выполнения, особенно если куча велика. Не используйте эту команду в средах, где это может повлиять на производительность, если куча сборки мусора велика.

Краткие сведения

dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]

Параметры

  • -h|--help

    Отображение справки в командной строке.

  • -p|--process-id <pid>

    Идентификатор процесса, из которого нужно получить дамп сборщика мусора.

  • -o|--output <gcdump-file-path>

    Путь, по которому нужно записывать собранные дампы сборщика мусора. По умолчанию используется значение .\YYYYMMDD_HHMMSS_<pid.gcdump>.

  • -v|--verbose

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

  • -t|--timeout <timeout>

    Прервать сбор дампа сборщика мусора, если он занимает больше указанного количества секунд. Значение по умолчанию — 30.

  • -n|--name <name>

    Имя процесса, из которого нужно получить дамп сборщика мусора.

Примечание.

В Linux и macOS эта команда ожидает, что целевое приложение и dotnet-gcdump будут совместно использовать одну и ту же переменную среды TMPDIR. В противном случае время ожидания команды истечет.

Примечание.

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

dotnet-gcdump ps

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

Краткие сведения

dotnet-gcdump ps [-h|--help]

Пример

Предположим, что вы запускаете длинное приложение с помощью команды dotnet run --configuration Release. В другом окне выполните dotnet-gcdump ps команду. Выходные данные, которые вы увидите, приведены ниже. Аргументы командной строки, если таковые имеются, отображаются с помощью dotnet-gcdump версии 6.0.320703 и более поздних версий.

> dotnet-gcdump ps
  
  21932 dotnet     C:\Program Files\dotnet\dotnet.exe     run --configuration Release
  36656 dotnet     C:\Program Files\dotnet\dotnet.exe

dotnet-gcdump report <gcdump_filename>

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

Краткие сведения

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

Параметры

  • -h|--help

    Отображение справки в командной строке.

  • -p|--process-id <pid>

    Идентификатор процесса, из которого нужно получить дамп сборщика мусора.

  • -t|--report-type <HeapStat>

    Тип создаваемого отчета. Доступные значения: heapstat (по умолчанию).

Устранение неполадок

  • В gcdump нет сведений о типе.

    До .NET Core 3.1 существовала проблема, при которой кэш типов не очищался между вызовами gcdump, когда они вызывались с помощью EventPipe. Это приводило к тому, что события, необходимые для определения сведений о типе, не отправлялись для второго и последующего вызовов gcdump. Это было исправлено в версии .NET Core 3.1-preview2.

  • COM и статические типы не содержатся в дампе сборщика мусора.

    До .NET Core 3.1 возникла проблема, из-за которой статические и COM-типы не отправлялись при вызове дампа GC через EventPipe. Это исправлено в .NET Core 3.1.

  • dotnet-gcdumpНе удается создать .gcdump файл из-за отсутствия сведений, например [Error] Exception во время gcdump: System.ApplicationException: ETL-файл показывает начало дампа кучи, но не его завершение. .gcdump Или файл не включает всю кучу.

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

  • dotnet-gcdump Возникает проблема с нехваткой памяти в ограниченной среде памяти.

    dotnet-gcdump выполняется путем сбора трассировки событий, создаваемых сборщиком мусора во время индуцированной коллекции поколения 2. Буфер коллекции событий принадлежит целевому приложению и может увеличиться до 256 МБ. dotnet-gcdump сама по себе также использует память. Если среда ограничена памятью, обязательно учитывайте эти факторы при сборе gcdump, чтобы предотвратить ошибки.