힙 분석 도구(dotnet-gcdump)
이 문서는 다음에 적용됩니다. ✔️ dotnet-gcdump
버전 3.1.57502 이상 버전
설치
다음 두 가지 방법으로 dotnet-gcdump
를 다운로드하고 설치할 수 있습니다.
dotnet 전역 도구:
dotnet-gcdump
NuGet 패키지의 최신 릴리스 버전을 설치하려면 dotnet tool install 명령을 사용합니다.dotnet tool install --global dotnet-gcdump
직접 다운로드:
플랫폼에 맞는 도구 실행 파일을 다운로드합니다.
OS 플랫폼 Windows x86 | x64 | Arm | Arm64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
참고 항목
x86 앱에서 dotnet-gcdump
를 사용하려면 해당하는 x86 버전의 도구가 필요합니다.
개요
dotnet-gcdump [-h|--help] [--version] <command>
설명
dotnet-gcdump
전역 도구는 EventPipe를 사용하여 라이브 .NET 프로세스의 GC(가비지 수집기) 덤프를 수집합니다. GC 덤프는 대상 프로세스에서 GC를 트리거하고 특수 이벤트를 켠 후 이벤트 스트림에서 개체 루트의 그래프를 다시 생성하여 만듭니다. 이 프로세스를 통해 프로세스가 실행되는 동안 최소한의 오버헤드로 GC 덤프를 수집할 수 있습니다. 해당 덤프는 다음을 비롯한 여러 시나리오에서 유용합니다.
- 여러 시점에 힙의 개체 수 비교
- 개체 루트 분석(“이 형식에 대한 참조를 여전히 포함하는 것은 무엇인가요?” 등의 질문에 답변)
- 힙의 개체 수에 대한 일반 통계 수집
dotnet-gcdump에서 캡처된 GC 덤프 보기
Windows의 .gcdump
파일은 분석을 위해 PerfView에서 보거나 Visual Studio에서 볼 수 있습니다. Windows 이외의 플랫폼에서는 현재 .gcdump
를 열 수 없습니다.
.gcdump
를 여러 개 수집하고 Visual Studio에서 동시에 열어 비교할 수 있습니다.
옵션
--version
dotnet-gcdump
유틸리티의 버전을 표시합니다.-h|--help
명령줄 도움말을 표시합니다.
명령
명령 |
---|
dotnet-gcdump collect |
dotnet-gcdump ps |
dotnet-gcdump report |
dotnet-gcdump collect
현재 실행 중인 프로세스에서 GC 덤프를 수집합니다.
Warning
GC 힙을 탐색하기 위해 이 명령은 2세대(전체) 가비지 수집을 트리거하고 이로 인해 특히 GC 힙이 클 경우 오랜 시간 런타임이 일시 중단될 수 있습니다. GC 힙이 클 경우 성능이 중요한 환경에서는 이 명령을 사용하지 마세요.
개요
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>
GC 덤프를 수집할 프로세스 ID입니다.
-o|--output <gcdump-file-path>
수집된 GC 덤프를 작성해야 하는 경로입니다. 기본값은 .\YYYYMMDD_HHMMSS_<pid>.gcdump입니다.
-v|--verbose
GC 덤프를 수집하는 동안 로그를 출력합니다.
-t|--timeout <timeout>
이 시간(초)보다 오래 걸릴 경우 GC 덤프 수집을 포기합니다. 기본값은 30입니다.
-n|--name <name>
GC 덤프를 수집할 프로세스의 이름입니다.
참고 항목
Linux 및 macOS에서 해당 명령은 대상 애플리케이션 및 dotnet-gcdump
가 동일한 TMPDIR
환경 변수를 공유할 것으로 예상합니다. 그러지 않으면 명령 시간이 초과됩니다.
참고 항목
dotnet-gcdump
를 사용하여 GC 덤프를 수집하려면 대상 프로세스를 실행하는 사용자와 동일한 사용자 또는 루트로 실행해야 합니다. 그러지 않으면 도구는 대상 프로세스와 연결을 설정하지 못합니다.
dotnet-gcdump ps
GC 덤프를 수집할 수 있는 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>
이전에 생성된 GC 덤프 또는 실행 중인 프로세스에서 보고서를 생성하고 stdout
에 씁니다.
개요
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
옵션
-h|--help
명령줄 도움말을 표시합니다.
-p|--process-id <pid>
GC 덤프를 수집할 프로세스 ID입니다.
-t|--report-type <HeapStat>
생성할 보고서의 유형입니다. 사용 가능한 옵션: heapstat(기본값)
문제 해결
gcdump에 형식 정보가 없습니다.
.NET Core 3.1 이전에는 EventPipe를 사용하여 호출된 gcdumps 사이에 형식 캐시가 지워지지 않는 문제가 있었습니다. 이 때문에 두 번째 및 후속 gcdumps에서는 형식 정보를 확인하는 데 필요한 이벤트가 전송되지 않았습니다. 이 문제는 .NET Core 3.1-preview2에서 해결되었습니다.
GC 덤프에 COM 및 정적 형식이 없습니다.
.NET Core 3.1 이전에는 EventPipe를 통해 GC 덤프를 호출할 경우 정적 및 COM 형식이 전송되지 않는 문제가 있었습니다. 이 문제는 .NET Core 3.1에서 수정되었습니다.
dotnet-gcdump
는 정보 누락으로 인해.gcdump
파일을 생성할 수 없습니다. 예를 들어, [오류] gcdump 중 예외: System.ApplicationException: ETL 파일에 힙 덤프의 시작은 표시되지만 완료는 표시되지 않습니다.. 또는.gcdump
파일에 전체 힙이 포함되지 않습니다.dotnet-gcdump
는 유도된 2세대 컬렉션 중에 가비지 수집기가 내보낸 이벤트 추적을 수집하는 방식으로 작동합니다. 힙이 충분히 크거나 이벤트 버퍼의 크기를 조정할 메모리가 충분하지 않은 경우 추적에서 힙 그래프를 재구성하는 데 필요한 이벤트가 삭제될 수 있습니다. 이 경우 힙 문제를 진단하려면 프로세스 덤프를 수집하는 것이 좋습니다.dotnet-gcdump
는 메모리가 제한된 환경에서 메모리 부족 문제를 일으키는 것으로 보입니다.dotnet-gcdump
는 유도된 2세대 컬렉션 중에 가비지 수집기가 내보낸 이벤트 추적을 수집하는 방식으로 작동합니다. 이벤트 컬렉션을 위한 버퍼는 대상 애플리케이션이 소유하며 최대 256MB까지 커질 수 있습니다.dotnet-gcdump
자체도 메모리를 사용합니다. 환경에 메모리가 제한된 경우 오류를 방지하려면 gcdump를 수집할 때 이러한 요소를 고려해야 합니다.
.NET