다음을 통해 공유


릴리스 빌드에서 메모리 사용량 분석(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. 사용 가능한 도구에서, 메모리 사용량을 선택하고 다음으로 시작을 선택합니다.

    메모리 사용량 진단 세션을 시작합니다. 시작

메모리 사용 모니터링

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

앱 메모리 사용의 타임라인 그래프를 보여 주는 Visual Studio 성능 프로파일러의 진단 도구 창 스크린샷

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

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

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

스냅샷을 수집하려면 메모리 데이터를 캡처하고자 할 때 스냅샷 만들기을 선택하세요.

스냅샷을 찍는 스크린샷

진단 세션 닫기

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

컬렉션 중지 스크린샷

컬렉션 중지 스크린샷

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

메모리 사용량 보고서

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

Visual Studio 성능 프로파일러의 메모리 사용량 도구에 있는 개요 페이지의 스크린샷으로, 메모리 사용량 그래프와 두 개의 스냅샷 창을 보여 줍니다.

Visual Studio 성능 프로파일러의 메모리 사용량 도구에 있는 개요 페이지의 스크린샷으로, 메모리 사용량 그래프와 두 개의 스냅샷 창을 보여 줍니다.

메모리 사용량 스냅샷

스냅샷 창의 숫자는 각 스냅샷을 만들 때 메모리의 개체와 바이트 및 스냅샷과 이전 스냅샷 간의 차이를 표시합니다.

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

스크린샷 스냅샷 보기 링크

C++의 경우 개체(Diff) 열은 할당(Diff)로 되어 있습니다.

이미지 묘사
1단계 스냅샷을 생성할 때 메모리에 있는 총 개체 수입니다. 형식의 인스턴스 수를 기준으로 정렬된 스냅샷 세부 정보 보고서를 표시하려면 이 링크를 선택합니다.
2단계 이 스냅샷의 총 메모리 개체 수와 이전 스냅샷 간의 차이입니다. 형식의 총 인스턴스 수 차이로 정렬된 스냅샷 차이 보고서를 표시하려면 이 링크를 선택합니다.
3단계 스냅샷을 생성할 때 메모리의 총 바이트 수입니다. 형식 인스턴스의 총 크기를 기준으로 정렬된 스냅샷 세부 정보 보고서를 표시하려면 이 링크를 선택합니다.
4단계 이 스냅샷의 총 메모리 개체 크기와 이전 스냅샷의 차이입니다. 양수는 이 스냅샷의 메모리 크기가 이전 스냅샷보다 크고 음수가면 크기가 더 작다는 것을 의미합니다. 기준선 ()은 스냅샷이 진단 세션의 첫 번째 스냅샷임을 의미합니다. 차이 없음 차이는 0임을 의미합니다. 형식의 총 인스턴스 크기 차이에 따라 정렬된 스냅샷 차이 보고서를 표시하려면 이 링크를 선택합니다.

스냅샷 보기 링크스냅샷 보기 링크

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

관리되는 형식 보고서

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

관리되는 형식 보고서의 스크린샷.

메모

.NET 코드의 경우 인스턴스 보기 아이콘(개체 유형 열인스턴스 아이콘)은 디버거 통합 메모리 사용량 도구 사용하거나 힙 스냅샷 열고 관리되는 메모리 디버그할선택하는 경우에만 사용할 수 있습니다.

상단 창에는 유형에 의해 참조되는 모든 객체의 크기(포함 크기)를 포함하여 스냅샷에 있는 유형의 개수와 크기가 표시됩니다.

아래쪽 창의 루트 트리에 대한 경로는 위쪽 창에서 선택한 형식을 참조하는 개체를 표시합니다. .NET 가비지 수집기는 개체에 대한 참조를 마지막으로 하는 형식이 해제된 후에만 개체의 메모리를 정리합니다. 루트 트리에 대한 경로를 사용하는 방법에 대한 자세한 내용은 루트 대한핫 경로 분석을 참조하세요.

관리되는 형식 보고서의 스크린샷

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

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

참조 형식 트리는 위쪽 창에서 선택한 형식에 의해 유지되는 참조를 표시합니다.

참조된 개체 보고서의 스크린샷

참조 형식 트리는 위쪽 창에서 선택한 형식에 의해 유지되는 참조를 표시합니다.

참조된 개체 보고서의 스크린샷

보고서 계층 필터

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

메모리 사용량 정렬 및 필터

메모리 사용량 정렬 및 필터

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

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

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

네이티브 유형 보고서

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

네이티브 형식 뷰의 스크린샷

네이티브 형식 뷰의 스크린샷

형식 뷰 스냅샷에 있는 형식의 수와 크기를 표시합니다.

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

    인스턴스 보기에는 선택한 형식의 각 인스턴스가 표시됩니다. 인스턴스를 선택하면 할당 호출 스택 창에서 인스턴스를 만든 호출 스택이 표시됩니다. (이 정보는 디버깅하는 동안에만 사용할 수 있습니다.)

    인스턴스 보기 및 할당 호출 스택 창의 스크린샷

  • 선택한 형식의 인스턴스 아이콘(개체 형식 열인스턴스 아이콘)을 선택하여 스냅샷에서 선택한 형식의 개체에 대한 정보를 표시합니다.

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

    인스턴스 보기 및 할당 호출 스택 창의 스크린샷

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

    스택 보기의 스크린샷

  • 보기 모드 목록에서 스택 보기 선택하여 선택한 형식에 대한 할당 스택을 확인합니다.

    스택 보기의 스크린샷

메모리 사용 인사이트

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

메모리 사용량 도구의 인사이트 보기 스크린샷

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

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

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

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

메모리 사용량 도구에서 네이티브 인사이트 보기의 스크린샷

변경(차이) 보고서

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

    셀의 변경 링크 선택 스크린샷

    셀의 변경 링크 선택 스크린샷

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

    비교 목록에서 스냅샷을 선택한 화면 스크린샷

    비교 대상 목록에서 스냅샷을 선택한 스크린샷

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

네이티브 형식 차이 보기의 스크린샷

상단 창에는 스냅샷에 있는 형식의 개수와 크기가 표시되며, 이 크기에는 해당 형식이 참조하는 모든 개체의 크기(포함 크기)가 포함됩니다.