성능 프로파일러에서 디버그하지 않고 메모리 사용량 분석(C#, Visual Basic, C++, F#)

메모리 사용량 도구는 앱의 메모리 사용량을 모니터링합니다. 이 도구를 사용하여 Visual Studio에서 활발하게 개발 중인 시나리오의 실시간 메모리 효과를 학습할 수 있습니다. 앱의 메모리 상태에 대한 자세한 스냅샷을 만들고 스냅샷을 비교하여 메모리 문제의 근본 원인을 찾을 수 있습니다. 메모리 사용량 도구는 .NET, ASP.NET, C++ 또는 혼합 모드(.NET 및 네이티브) 앱에서 사용할 수 있습니다.

메모리 사용량 도구는 디버거를 사용하거나 사용하지 않고 실행할 수 있습니다. 다음 문서에서는 Visual Studio 성능 프로파일러에서 디버거 없이 메모리 사용량 도구를 사용하는 방법을 보여 줍니다. 이 방법은 릴리스 빌드에 권장됩니다. 요구 사항에 가장 적합한 메모리 분석 도구를 선택하는 방법에 대한 자세한 내용은 메모리 분석 도구 선택을 참조하세요.

메모리 사용량 진단 세션

메모리 사용량 진단 세션을 시작하려면:

  1. Visual Studio에서 프로젝트를 엽니다.

    메모리 사용량 도구는 .NET, ASP.NET, C++ 또는 혼합 모드(.NET 및 네이티브) 앱을 지원합니다.

  2. 디버그 메뉴에서 솔루션 구성을 릴리스로 설정하고 로컬 Windows 디버거(또는 로컬 머신)를 배포 대상으로 선택합니다.

  3. 메뉴 모음에서 디버그>성능 프로파일러를 선택합니다.

  4. 사용 가능한 도구에서 메모리 사용량을 선택한 다음, 시작을 선택합니다.

    Start a Memory Usage diagnostic session.

    Start a Memory Usage diagnostic session.

메모리 사용 모니터링

진단 세션을 시작하면 앱이 시작되고 진단 도구 창에 앱의 메모리 사용에 대한 타임라인 그래프가 표시됩니다.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

Screenshot of the Diagnostic Tools window in the Visual Studio Performance Profiler showing a timeline graph of the app's memory use.

타임라인 그래프는 앱 실행 시 메모리 변동을 보여줍니다. 그래프에 스파이크는 일반적으로 일부 코드에서 데이터를 수집하거나 생성한 다음, 처리가 완료되면 삭제함을 나타냅니다. 큰 스파이크는 최적화할 수 있는 영역을 나타냅니다. 주요 관심사는 반환되지 않는 메모리 사용량 증가입니다. 이는 비효율적인 메모리 사용 또는 메모리 누수를 나타낼 수 있습니다.

앱 메모리 상태 스냅샷 만들기

앱은 많은 개체를 사용하며 하나의 시나리오에 분석을 집중할려고 할 수 있습니다. 또는 조사할 메모리 문제가 있을 수 있습니다. 진단 세션 중에 스냅샷을 만들어 특정 순간에 메모리 사용량을 캡처할 수 있습니다. 메모리 문제가 나타나기 전 앱의 기본 스냅샷을 만드는 것이 좋습니다. 문제가 처음 발생한 후 다른 스냅샷을 만들고 시나리오를 반복할 수 있는 경우 추가 스냅샷을 만들 수 있습니다.

스냅샷을 수집하려면 메모리 데이터를 캡처할 때 스냅샷 만들기를 선택합니다.

Screenshot of taking a snapshot.

진단 세션 닫기

보고서를 생성하지 않고 모니터링 세션을 중지하려면 진단 창을 닫기만 하면 됩니다. 스냅샷 수집을 완료하거나 스냅샷을 만들 때 보고서를 생성하려면 컬렉션 중지를 선택합니다.

Screenshot of stopping the collection.

Screenshot of stopping the collection.

데이터를 수집하거나 표시하는 데 문제가 있는 경우 프로파일링 오류 문제 해결 및 문제 해결을 참조하세요.

메모리 사용량 보고서

데이터 수집을 중지하면 메모리 사용량 도구가 앱을 중지하고 메모리 사용량 개요 보고서를 표시합니다.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

Screenshot of the overview page in the Memory Usage tool in the Visual Studio Performance Profiler, showing a memory usage graph and two snapshot panes.

메모리 사용량 스냅샷

스냅샷 창의 숫자는 각 스냅샷이 생성되었을 때 메모리 내 개체 및 바이트와 이전 스냅샷과의 차이를 보여줍니다.

숫자는 새 Visual Studio 창에서 상세 메모리 사용량 보고서 보기를 여는 링크입니다. 스냅샷 정보 보고서에서는 한 스냅샷의 유형 및 인스턴스를 보여줍니다. 스냅샷 차이 보고서에서는 두 스냅샷의 유형 및 인스턴스를 비교합니다.

Screenshot of Snapshot view links

C++의 경우 개체(Diff) 열의 이름은 할당(Diff)입니다.

이미지 설명
Step 1 스냅샷을 만들 때 메모리의 총 개체 수입니다. 이 링크를 선택하면 유형 인스턴스의 개수별로 정렬된 스냅샷 정보 보고서가 표시됩니다.
Step 2 이 스냅샷의 총 메모리 개체 수와 이전 스냅샷 간의 차이입니다. 이 링크를 선택하면 유형의 인스턴스 총 개수 차이별로 정렬된 스냅샷 차이 보고서가 표시됩니다.
Step 3 스냅샷을 만들 때 메모리의 총 바이트 수입니다. 이 링크를 선택하면 유형 인스턴스의 총 크기별로 정렬된 스냅샷 정보 보고서가 표시됩니다.
Step 4 이 스냅샷의 총 메모리 개체 크기와 이전 스냅샷 간의 차이입니다. 양수는 이 스냅샷의 메모리 크기가 이전 스냅샷보다 큰 것을 의미하고 음수는 크기가 더 작음을 의미합니다. 기준선은 진단 세션에서 스냅샷이 첫 번째임을 의미합니다. 차이 없음은 차이가 0임을 의미합니다. 이 링크를 선택하면 유형의 인스턴스 총 크기 차이별로 정렬된 스냅샷 차이 보고서가 표시됩니다.

Snapshot view links

이미지 설명
Step 1 스냅샷을 만들 때 메모리의 총 바이트 수입니다. 이 링크를 선택하면 유형 인스턴스의 총 크기별로 정렬된 스냅샷 정보 보고서가 표시됩니다.
Step 2 스냅샷을 만들 때 메모리의 총 개체 수입니다. 이 링크를 선택하면 유형 인스턴스의 개수별로 정렬된 스냅샷 정보 보고서가 표시됩니다.
Step 3 이 스냅샷의 총 메모리 개체 크기와 이전 스냅샷 간의 차이입니다. 양수는 이 스냅샷의 메모리 크기가 이전 스냅샷보다 큰 것을 의미하고 음수는 크기가 더 작음을 의미합니다. 기준선은 진단 세션에서 스냅샷이 첫 번째임을 의미합니다. 차이 없음은 차이가 0임을 의미합니다. 이 링크를 선택하면 유형의 인스턴스 총 크기 차이별로 정렬된 스냅샷 차이 보고서가 표시됩니다.
Step 4 이 스냅샷의 총 메모리 개체 수와 이전 스냅샷 간의 차이입니다. 이 링크를 선택하면 스냅샷 차이 보고서가 표시됩니다. 이 보고서는 형식 인스턴스의 총 개수 차이별로 정렬됩니다.

관리되는 형식 보고서

메모리 사용량 요약 표에서 개체 (차이) 셀의 현재 링크를 선택합니다.

Screenshot of managed type report.

참고 항목

.NET 코드의 경우 디버거 통합 메모리 사용량 도구를 사용하거나 힙 스냅샷 열고 관리되는 메모리 디버그를 선택하는 경우에만 인스턴스 보기 아이콘(The instance icon in the Object Type column)을 사용할 수 있습니다.

Screenshot of managed type report.

위쪽 창에는 형식에서 참조되는 모든 개체의 크기(포함 크기)를 포함하여 스냅샷의 형식 개수 및 크기가 표시됩니다.

아래쪽 창의 루트 경로 트리에는 위쪽 창에서 선택한 형식을 참조하는 개체가 표시됩니다. .NET 가비지 수집기는 개체를 참조하는 마지막 형식이 해제된 경우에만 개체에 대한 메모리를 정리합니다.

참조 된 형식 트리에는 위쪽 창에서 선택한 형식이 보유하고 있는 참조가 표시됩니다.

Screenshot of Referenced Objects report.

참조 된 형식 트리에는 위쪽 창에서 선택한 형식이 보유하고 있는 참조가 표시됩니다.

Screenshot of Referenced Objects report.

보고서 트리 필터

앱의 많은 형식은 앱 개발자에게 필요하지 않습니다. 스냅샷 보고서 필터는 관리되는 메모리루트 경로 트리에서 이러한 형식의 대부분을 숨길 수 있습니다.

Sort and filter options

Sort and filter options

  • 형식 이름별로 트리를 필터링하려면 필터 상자에 이름을 입력합니다. 필터는 대/소문자를 구분하지 않고 형식 이름의 모든 부분에서 지정한 문자열을 인식합니다.

  • 필터 드롭다운에서 내 코드만 표시 필터를 선택하면 외부 코드로 생성된 대부분의 인스턴스를 숨깁니다. 외부 유형은 운영 체제 또는 프레임워크 구성 요소에 속하거나 컴파일러에서 생성합니다.

  • 필터 드롭다운에서 작은 개체 축소를 선택하여 크기(바이트) 가 총 메모리의 0.5% 미만인 유형을 숨깁니다.

네이티브 유형 보고서

진단 도구 창의 메모리 사용량 요약 테이블에서 할당(차이) 또는 힙 크기(차이) 셀의 현재 링크를 선택합니다.

Screenshot of Native Type View.

Screenshot of Native Type View.

형식 뷰 에는 스냅샷의 형식 수와 크기가 표시됩니다.

  • 선택한 유형 옆의 보기 인스턴스 아이콘을 선택하면 스냅샷에서 선택한 유형의 개체에 대한 정보를 표시합니다.

    인스턴스 뷰에는 선택한 형식의 각 인스턴스가 표시됩니다. 인스턴스를 선택하면 할당 호출 스택 창에 인스턴스를 만든 호출 스택이 표시됩니다.

    Screenshot of the Instances view and Allocation Call Stack pane.

  • 선택한 형식의 인스턴스 아이콘(The instance icon in the Object Type column)을 선택하여 스냅샷에서 선택한 형식의 개체에 대한 정보를 표시합니다.

    인스턴스 뷰에는 선택한 형식의 각 인스턴스가 표시됩니다. 인스턴스를 선택하면 할당 호출 스택 창에 인스턴스를 만든 호출 스택이 표시됩니다.

    Screenshot of the Instances view and Allocation Call Stack pane.

  • 스택을 선택하여 선택한 형식에 대한 할당 스택을 확인합니다.

    Screenshot of Stacks view.

  • 뷰 모드 에서 스택 뷰 를 선택하여 선택한 형식에 대한 할당 스택을 확인합니다.

    Screenshot of Stacks view.

메모리 사용 인사이트

관리되는 메모리의 경우 메모리 분석 도구는 여러 가지 강력한 기본 제공 자동 인사이트를 제공합니다. 관리되는 형식 보고서에서 Insights 탭을 선택하면 중복 문자열, 스파스 배열 및 이벤트 처리기 누수와 같은 적용 가능한 자동 인사이트가 표시됩니다.

Screenshot of the insight view in the Memory Usage tool.

중복 문자열 섹션에는 힙에 여러 번 할당되는 문자열 목록이 표시됩니다. 또한 이 섹션에서는 총 낭비된 메모리, 즉 문자열 크기의 (인스턴스 수 - 1)을 보여 줍니다.

스파스 배열 섹션은 주로 0개 요소로 채워진 배열을 보여 줍니다. 이 배열은 성능 및 메모리 사용 측면에서 비효율적일 수 있습니다. 메모리 분석 도구는 이러한 배열을 자동으로 검색하고 이러한 0 값으로 인해 얼마나 많은 메모리가 낭비되는지 보여 줍니다.

Visual Studio 2022 버전 17.9 미리 보기 1에서 사용할 수 있는 이벤트 처리기 누수 섹션에는 한 개체가 다른 개체의 이벤트를 구독할 때 발생할 수 있는 잠재적인 메모리 누수가 표시됩니다. 이벤트 게시자가 구독자보다 오래 지속되는 경우 구독자는 다른 참조가 없더라도 계속 작동하고 있습니다. 이로 인해 사용되지 않은 메모리가 제대로 해제되지 않아 애플리케이션이 시간이 지남에 따라 점점 더 많은 메모리를 사용하게 되는 메모리 누출이 발생할 수 있습니다.

특정 형식에는 보유 중인 네이티브 메모리의 크기를 확인하기 위해 읽을 수 있는 필드가 있는 것으로 알려져 있습니다. Insights 탭은 개체 그래프에 가짜 네이티브 메모리 노드를 표시합니다. 이 노드는 UI가 해당 노드를 인식하고 크기 및 참조 그래프를 표시할 수 있도록 부모 개체에 의해 유지됩니다.

Screenshot of the native insight view in the Memory Usage tool.

변경(차이) 보고서

  • 메모리 사용 개요 페이지의 스냅샷 창 셀에서 변경 링크를 선택합니다.

    Screenshot of Choose a change link in a cell.

    Screenshot of Choose a change link in a cell.

  • 관리되는 보고서 또는 네이티브 보고서의 비교 대상 목록에서 스냅샷을 선택합니다.

    Screenshot of Choose a snapshot from the Compare with list.

    Screenshot of Choose a snapshot from the Compare To list.

변경 보고서는 기본 스냅샷 값과 비교 스냅샷 간의 차이를 표시하는 열( (차이) 로 표시됨)을 기본 보고서에 추가합니다. 네이티브 형식 뷰 차이 보고서가 표시되는 모양은 다음과 같습니다.

Screenshot of Native Types Diff View.

Screenshot of Native Types Diff View.

위쪽 창에는 형식에서 참조되는 모든 개체의 크기(포함 크기)를 포함하여 스냅샷의 형식 개수 및 크기가 표시됩니다.