Visual Studio 디버거 없이 메모리 사용 분석Analyze memory usage without the Visual Studio debugger

디버그하지 않고 메모리 사용량 도구를 사용하여 다음을 수행할 수 있습니다.You can use the Memory Usage tool without debugging to do the following

  • 시나리오를 개발하는 동안 Visual Studio에서 직접 앱의 메모리 사용 권한을 모니터링합니다.Monitor your app's memory use right in Visual Studio while you are developing a scenario.

  • 앱의 메모리 상태에 대한 자세한 스냅숏을 만듭니다.Create detailed snapshots of the state of your app's memory.

  • 스냅숏을 비교하여 메모리 문제의 근본 원인을 찾습니다.Compare snapshots to find the root cause of memory issues.

    이 항목에서는 메모리 사용량 도구를 사용하여 UWP XAML 앱을 분석하는 방법에 대해 설명합니다.This topic describes how use the Memory Usage tool to analyze a UWP XAML app. JavaScript 및 HTML을 사용하는 UWP 앱에서 메모리 사용을 분석하려는 경우 메모리 사용 분석(JavaScript)을 참조하세요.If you want to analyze memory use in UWP app that uses JavaScript and HTML, see Analyze memory usage (JavaScript).

메모리 사용량 진단 세션 시작Start a Memory Usage diagnostic session

  1. Visual Studio에서 C# 유니버설 Windows 프로젝트를 엽니다.Open a C# Universal Windows project in Visual Studio.

  2. 메뉴 모음에서 디버그 > 성능 프로파일러를 선택합니다.On the menu bar, choose Debug > Performance Profiler.

  3. 메모리 사용량을 선택한 다음 페이지 맨 아래에서 시작 단추를 선택합니다.Select Memory Usage and then choose the Start button at the bottom of the page.

    메모리 사용량 진단 세션 시작Start a Memory Usage diagnostic session

메모리 사용 모니터링Monitor memory use

메모리 사용량 도구로 문제를 찾아서 해결할 수 있는 상세 보고서를 생성할 수 있지만, 이 도구를 사용하여 적극적으로 개발 중인 시나리오에 대한 실시간 메모리 영향을 연구할 수도 있습니다.Although you can use the Memory Usage tool to generate detailed reports that you can use to find and fix issues, you can also use it to study the real-time memory effects of a scenario you're actively developing.

진단 세션을 시작하면 앱이 시작되고 진단 도구 창에 앱의 메모리 사용에 대한 타임라인 그래프가 표시됩니다.When you start a diagnostic session, your app starts and the Diagnostic Tools window displays a timeline graph of your app's memory use.

메모리 사용량 개요 페이지Memory Usage overview page

이 타임라인 그래프에는 앱을 실행할 때 앱의 메모리 변동 사항이 표시됩니다.The timeline graph shows fluctuations in your app's memory as it runs. 그래프에 스파이크가 있으면 일반적으로 일부 코드에서 데이터를 수집하거나 생성한 다음 처리가 완료되면 삭제함을 나타냅니다.Spikes in the graph usually indicate that some code is collecting or creating data and then discarding it when the processing is done. 큰 스파이크는 최적화할 수 있는 영역을 나타냅니다.Large spikes indicate areas that you might be able to optimize. 비효율적인 메모리 사용량 또는 메모리 누수를 나타낼 수 있기 때문에 더욱 걱정스러운 점은 되돌릴 수 없는 메모리 사용량이 증가하는 문제입니다.Of more concern is a rise in memory consumption that's not returned because it may indicate inefficient memory use or even a memory leak.

모니터링 세션 닫기Close a monitoring session

수집 중지Stop collection

보고서를 생성하지 않고 모니터링 세션을 중지하려면 진단 창을 닫기만 하면 됩니다.To stop a monitoring session without creating a report, just close the diagnostic window. 메모리 스냅숏을 만들 때 보고서를 생성하려면 중지를 선택합니다.To generate a report when you have taken memory snapshots, choose Stop.

앱의 메모리 상태 스냅숏 만들기Take snapshots of the memory state of your app

조사할 메모리 관련 문제를 발견하면 진단 세션이 진행되는 동안 스냅숏을 만들어서 특정 순간의 메모리 개체를 캡처할 수 있습니다.If you discover a memory issue that you want to investigate, you can take snapshots during the diagnostic session to capture objects in memory at particular moments. 앱에서 무수히 많은 개체 유형을 사용하므로 시나리오 하나에 대한 분석에 집중하려고 할 수 있습니다.Because an app uses a large number of many types of objects, you might want to concentrate your analysis on one scenario. 또한 메모리 문제가 나타나기 전 앱의 기본 스냅숏을 만들거나, 첫 번째 문제가 발생한 이후의 다른 스냅숏을 만들거나, 시나리오를 반복할 수 있는 경우 하나 이상의 추가 스냅숏을 만드는 것도 좋습니다.It's also a good idea to get a baseline snapshot of the app before a memory issue appears, another snapshot after the first occurrence of the problem, and one or more additional snapshots if you can repeat the scenario.

스냅숏을 수집하려면 새로운 진단 세션을 시작합니다.To collect snapshots, start a new diagnostic session. 메모리 데이터를 캡처하려는 경우 스냅숏 만들기를 선택합니다.Choose Take Snapshot when you want to capture the memory data. 보고서를 생성하려면 중지를 선택합니다.To generate a report, choose Stop.

메모리 사용량 개요 페이지Memory Usage overview page

데이터 컬렉션을 중지한 후 메모리 사용량 도구에서 앱을 중지하고 개요 보고서를 표시합니다.After you stop data collection, the Memory Usage tool stops the app and displays the overview report.

메모리 사용량 개요 페이지Memory Usage overview page

메모리 사용량 스냅숏 뷰Memory Usage snapshot views

스냅숏 뷰를 사용하여 새 Visual Studio 창에서 자세한 보고서를 엽니다.You use snapshot views to open detailed reports in new Visual Studio windows. 다음과 같은 두 종류의 스냅숏 뷰가 있습니다.There are two kinds of snapshot views:

1단계Step 1 링크 텍스트는 스냅숏을 만들 때 메모리의 총 바이트 수를 보여 줍니다.The link text shows the total number of bytes in memory when the snapshot was taken.

이 링크를 선택하면 유형 인스턴스의 총 크기별로 정렬된 스냅숏 정보 보고서가 표시됩니다.Choose this link to display a snapshot details report that's sorted by the total size of the type instances.
2단계Step 2 링크 텍스트는 스냅숏을 만들었을 때의 총 메모리 개체 수를 보여 줍니다.The link text shows the total number of objects in memory when the snapshot was taken.

이 링크를 선택하면 유형 인스턴스의 개수별로 정렬된 스냅숏 정보 보고서가 표시됩니다.Choose this link to display a snapshot details report that's sorted by the count of instances of the types.
3단계Step 3 링크 텍스트는 현재 이 스냅숏의 총 메모리 개체 크기와 이전 스냅숏의 총 크기 간의 차이를 보여 줍니다.The link text shows the difference between the total size of objects in memory at the moment of this snapshot and the total size of the previous snapshot.

이 스냅숏의 메모리 크기가 이전 스냅숏보다 크면 링크 텍스트는 양수이고 작으면 음수입니다.The link text is a positive number when the memory size of this snapshot is larger than the previous one, and a negative number when the size is smaller. 링크 텍스트 기본은 이 스냅숏이 진단 세션의 첫 번째 스냅숏임을 나타냅니다. 차이 없음은 차이가 0임을 나타냅니다.The link text Baseline indicates that this snapshot is the first in the diagnostic session; No Difference indicates that the difference is zero.

이 링크를 선택하면 유형 인스턴스의 총 크기 차이별로 정렬된 스냅숏 차이 보고서가 표시됩니다.Choose this link to display a snapshot diff report that's sorted by the difference in the total size of instances of the types.
4단계Step 4 링크 텍스트는 이 스냅숏의 총 메모리 개체 수와 이전 스냅숏의 개체 수 간의 차이를 보여 줍니다.The link text shows the difference between the total number of memory objects in this snapshot and the number of objects in the previous snapshot.

이 링크를 선택하면 유형 인스턴스의 총 개수 차이별로 정렬된 스냅숏 차이 보고서가 표시됩니다.Choose this link to display a snapshot diff report that's sorted by the difference in the total count of instances of the types.

스냅숏 보고서Snapshot reports

메모리 사용량 스냅숏 보고서Memory Usage snapshot report

스냅숏 보고서 트리Snapshot report trees

관리되는 힙Managed Heap

관리되는 힙 트리 관리되는 힙 트리(스냅숏 정보)관리되는 힙 트리(스냅숏 차이)에서는 보고서의 형식 및 인스턴스를 보여 줍니다.The managed heap tree Managed Heap tree (Snapshot details) and the Managed Heap tree (Snapshot diff) show the types and instances in the report. 형식 또는 인스턴스를 선택하면 선택한 항목에 대한 루트 경로참조 개체 트리가 표시됩니다.Selecting a type or instance displays the Paths to Root and Referenced Objects trees for the selected item.

루트 경로Paths to Root

루트 경로 트리(스냅숏 정보)루트 경로 트리(스냅숏 차이)에서는 형식 또는 인스턴스를 참조하는 개체의 체인을 보여 줍니다.The Paths to Root tree (Snapshot details) and the Paths to Root tree (Snapshot diff) show the chain of objects that reference the type or instance. .NET Framework 가비지 수집기는 개체에 대한 모든 참조가 해제된 경우에만 개체에 대한 메모리를 정리합니다.The .NET Framework garbage collector cleans up the memory for an object only when all references to it have been released.

참조된 개체Referenced Objects

참조된 개체 트리(스냅숏 정보)참조된 개체 트리(스냅숏 차이)에서는 선택한 형식 또는 인스턴스가 참조하는 개체를 보여 줍니다.The Referenced Objects tree (Snapshot details) and the Referenced Objects tree (Snapshot diff) show the objects that the selected type or instance references.

개체 형식 및 인스턴스 필드Object Type and Instance fields

개체 형식 항목에 자식 항목이 있으면 화살표 아이콘을 선택하여 표시할 수 있습니다.When an Object Type entry has child entries, you can choose the arrow icon to display them. 개체 형식 텍스트의 색상이 파란색이면 해당 항목을 선택하여 소스 코드 파일에서 해당 개체로 이동할 수 있습니다.If the color of the Object Type text is blue, you can choose it to navigate to the object in its source code file. 소스 파일은 별도의 창에서 열립니다.The source file is opened in a separate window.

인스턴스 이름은 메모리 사용량 도구에서 생성하는 고유한 ID입니다.Instance names are unique IDs that are generated by the Memory Usage tool.

쉽게 식별할 수 없는 형식이 있거나 이러한 형식이 코드와 어떻게 관련되는지 모르는 경우 개체의 소유권 체인과 관련되어 있기 때문에 메모리 사용량 도구에서 표시하는 .NET Framework, 운영 체제 또는 컴파일러의 개체일 수 있습니다.If you notice a type that you can't easily identify or if you don't know how it's involved in your code, it's probably an object from the .NET Framework, operating system, or compiler that the Memory Usage tool displays because it's involved in the ownership chains of your objects.

보고서 트리 필터Report tree filters

대다수 앱에는 굉장히 다양한 유형이 있는데, 이 중 대부분의 유형에는 앱 개발자가 거의 관심을 두지 않습니다.Most apps contain a surprisingly large number of types, most of which are not very interesting to the app developer. 메모리 사용량 도구는 관리되는 힙루트 경로 트리에서 이러한 형식을 대부분 숨기는 데 사용할 수 있는 필터 두 개를 정의합니다.The Memory Usage tool defines two filters that you can use to hide most of these types in the Managed Heap and Paths to Root trees. 또한 유형 이름별로 트리를 필터링할 수도 있습니다.You can also filter a tree by type name.

정렬 및 필터 옵션Sort and filter options

필터Filter

필터 상자에 문자열을 입력하여 지정한 텍스트가 포함된 형식으로 트리 표시를 제한합니다.Enter a string in the Filter box to restrict the tree displays to types that contain the specified text. 필터는 대/소문자를 구분하지 않고 유형 이름의 모든 부분에서 지정한 문자열을 인식합니다.The filter is not case-sensitive, and it recognizes the specified string in any part of the type names.

작은 개체 축소Collapse Small Objects

이 필터를 적용하면 크기(바이트) 가 총 스냅숏 메모리 크기의 0.5%보다 작은 형식이 관리되는 힙 목록에서 숨겨집니다.When this filter is applied, types whose Size (Bytes) is less than 0.5 percent of the total size of the snapshot memory are hidden in the Managed Heap list.

내 코드만Just My Code

내 코드만 필터는 외부 코드로 생성된 인스턴스를 대부분 숨깁니다.The Just My Code filter hides most instances that are generated by external code. 외부 유형은 운영 체제 또는 프레임워크 구성 요소에서 소유하거나 컴파일러에서 생성합니다.External types are owned by the operating system or by Framework components, or are generated by the compiler.

스냅숏 정보 보고서Snapshot details reports

스냅숏 정보 보고서를 사용하여 진단 세션에서 스냅숏 하나에만 집중합니다.You use a snapshot details report to focus on one snapshot from a diagnostic session. 정보 보고서를 열려면 다음 그림과 같이 스냅숏 뷰에서 링크 중 하나를 선택합니다.To open a details report, choose one of the links in a snapshot view, as shown in the following picture. 두 링크 모두 동일한 보고서를 열지만, 보고서에서 관리되는 힙 트리의 시작 정렬 순서만 다릅니다.Both links open the same report; the only difference is the starting sort order of the Managed Heap tree in the report. 두 경우 모두 보고서를 열고 나서 정렬 순서를 변경할 수 있습니다.In both cases, you can change the sort order after the report opens.

스냅숏 뷰의 스냅숏 보고서 링크Links to snapshot report in a snapshot view

  • MB 링크는 포함 크기(바이트) 열을 기준으로 보고서를 정렬합니다.The MB link sorts the report by the Inclusive Size (Bytes) column.

  • 개체 링크는 개수 열을 기준으로 보고서를 정렬합니다.The objects link sorts the report by the Count column.

관리되는 힙 트리(스냅숏 정보)Managed Heap tree (Snapshot details)

관리되는 힙 트리에는 메모리에 보관된 개체의 형식이 나열됩니다.The Managed Heap tree lists the types of objects that are held in memory. 유형에서 가장 큰 인스턴스 10개를 크기별로 정렬해서 볼 수 있도록 유형 이름을 확장할 수 있습니다.You can expand a type name to view the ten largest instances of the type, sorted by size. 형식 또는 인스턴스를 선택하면 선택한 항목에 대한 루트 경로참조 개체 트리가 표시됩니다.Selecting a type or instance displays the Paths to Root and Referenced Objects trees for the selected item.

관리되는 힙 트리Managed Heap tree

개체 형식Object Type 유형 이름 또는 개체 인스턴스입니다.The name of the type or object instance.
개수Count 유형의 개체 인스턴스 수입니다.The number of object instances of the type. 인스턴스의 경우 이 숫자는 항상 1입니다.The number is always 1 for an instance.
크기(바이트)Size (Bytes) 유형의 경우 인스턴스에 포함된 개체 크기를 제외한 메모리 스냅숏 유형의 모든 인스턴스 크기입니다.For a type, the size of all instances of the type in the memory snapshot, excluding the size of objects contained in the instances.

인스턴스의 경우 인스턴스에 포함된 개체 크기를 제외한For an instance, type, the size of the object excluding the size of objects contained in the instance. 개체 크기입니다.instances.
포함 크기(바이트)Inclusive Size (Bytes) 포함된 개체 크기를 비롯한 유형의 인스턴스 크기 또는 단일 인스턴스 크기입니다.The size of the instances of the type or the size of a single instance, including the size of contained objects.

루트 경로 트리(스냅숏 정보)Paths to Root tree (Snapshot details)

루트 경로 트리는 형식 또는 인스턴스를 참조하는 개체의 체인을 보여 줍니다.The Paths to Root tree shows the chain of objects that reference the type or instance. .NET Framework 가비지 수집기는 개체에 대한 모든 참조가 해제된 경우에만 개체에 대한 메모리를 정리합니다.The .NET Framework garbage collector cleans up the memory for an object only when all references to it have been released.

형식에 대한 루트 경로 트리Paths to Root tree for Types

루트 경로 트리에서 형식을 보면 해당 형식을 참조하는 형식의 개체 수가 참조 개수 열에 표시됩니다.When you view a type in the Paths to Root tree, the number of objects of the types that hold references to that type is displayed in the Reference Count column. 인스턴스를 분석할 때에는 이 열이 나타나지 않습니다.The column does not appear when you analyze an instance.

참조된 개체 트리(스냅숏 정보)Referenced Objects tree (Snapshot details)

참조된 개체 트리는 선택한 형식 또는 인스턴스가 참조하는 개체를 보여 줍니다.The Referenced Objects tree shows the objects that the selected type or instance references.

인스턴스에 대한 참조된 개체 트리Referenced Objjects tree for instances

개체 형식/인스턴스Object Type / Instance 유형 이름 또는 개체 인스턴스입니다.The name of the type or object instance.
크기(바이트)Size (Bytes) 유형의 경우 유형에 포함된 개체 크기를 제외한 유형의 모든 인스턴스 크기입니다.For a type, the size of all instances of the type, excluding the size of objects contained in the type.

인스턴스의 경우 개체에 포함된 개체 크기를 제외한 개체 크기입니다.For an instance, the size of the object, excluding the size of objects contained in the object.
포함 크기(바이트)Inclusive Size (Bytes) 포함된 개체의 크기를 비롯한 유형의 총 인스턴스 크기 또는 단일 인스턴스 크기입니다.The total size of the instances of the type or the size of the instance, including the size of contained objects.

스냅숏 차이(diff) 보고서Snapshot difference (diff) reports

스냅숏 차이(diff) 보고서는 기본 스냅숏과 기본 스냅숏 바로 직전에 만든 스냅숏 간의 변경 사항을 보여 줍니다.A snapshot difference (diff) report shows the changes between a primary snapshot and the snapshot that was taken immediately before it. 차이 보고서를 열려면 다음 그림과 같이 스냅숏 뷰에서 링크 중 하나를 선택합니다.To open a diff report, choose one of the links in a snapshot view, as shown in the following picture. 두 링크 모두 동일한 보고서를 열지만, 보고서에서 관리되는 힙 트리의 시작 정렬 순서만 다릅니다.Both links open the same report; the only difference is the starting sort order of the Managed Heap tree in the report. 보고서를 연 후 정렬 순서를 변경할 수 있습니다.You can change the sort order after the report opens.

스냅숏 뷰의 차이 보고서 링크Links to difference report in a snapshot view

  • MB 링크는 포함 크기(바이트) 열을 기준으로 보고서를 정렬합니다.The MB link sorts the report by the Inclusive Size (Bytes) column.

  • 개체 링크는 개수 열을 기준으로 보고서를 정렬합니다.The objects link sorts the report by the Count column.

관리되는 힙 트리(스냅숏 차이)Managed Heap tree (Snapshot diff)

관리되는 힙 트리에는 메모리에 보관된 개체의 형식이 나열됩니다.The Managed Heap tree lists the types of objects that are held in memory. 유형에서 가장 큰 인스턴스 10개를 크기별로 정렬해서 볼 수 있도록 유형 이름을 확장할 수 있습니다.You can expand a type name to view the ten largest instances of the type, sorted by size. 형식 또는 인스턴스를 선택하면 선택한 항목에 대한 루트 경로참조 개체 트리가 표시됩니다.Selecting a type or instance displays the Paths to Root and Referenced Objects trees for the selected item.

차이 보고서의 형식에 대한 관리되는 힙 트리Managed Heap tree for a type in difference report

그림에서 개수, 크기(바이트)포함 크기(바이트) 열은 축소되어 있습니다.Notice that the Count, Size (Bytes), and Inclusive Size (Bytes) columns have been collapsed in the picture.

개체 형식Object Type 유형 이름 또는 개체 인스턴스입니다.The name of the type or object instance.
개수Count 기본 스냅숏에 있는 유형의 인스턴스 수입니다.The number of instances of a type in the primary snapshot. 인스턴스의 경우 개수는 항상 1입니다.Count is always 1 for an instance.
개수 차이Count Diff 유형의 경우 기본 스냅숏과 이전 스냅숏 간 유형의 인스턴스 수 차이입니다.For a type, the difference in the number of instances of the type between the primary snapshot and the previous snapshot. 인스턴스의 경우 이 필드는 비어 있습니다.The field is blank for an instance.
크기(바이트)Size (Bytes) 개체에 포함된 개체의 크기를 제외한 기본 스냅숏의 개체 크기입니다.The size of the objects in the primary snapshot, excluding the size of objects contained in the objects. 형식의 경우 크기(바이트)포함 크기(바이트) 는 형식 인스턴스의 총 크기입니다.For a type, Size (Bytes) and Inclusive Size (Bytes) are the totals of the sizes of the type instances.
총 크기 차이(바이트)Total Size Diff (Bytes) 유형의 경우 인스턴스에 포함된 개체 크기를 제외한 기본 스냅숏과 이전 스냅숏 간 유형의 총 인스턴스 크기의 차이를 나타냅니다.For a type, the difference in the total size of instances of the type between the primary snapshot and the previous snapshot, excluding the size of objects contained in the instances. 인스턴스의 경우 이 필드는 비어 있습니다.The field is blank for an instance.
포함 크기(바이트)Inclusive Size (Bytes) 개체에 포함된 개체의 크기를 비롯한 기본 스냅숏의 개체 크기입니다.The size of the objects in the primary snapshot, including the size of objects contained in the objects.
포함 크기 차이(바이트)Inclusive Size Diff (Bytes) 유형의 경우 개체에 포함된 개체 크기를 비롯한 기본 스냅숏과 이전 스냅숏 간 유형의 모든 인스턴스 크기 차이를 나타냅니다.For a type, the difference in the size of all instances of the type between the primary snapshot and the previous snapshot, including the size of objects contained in the objects. 인스턴스의 경우 이 필드는 비어 있습니다.The field is blank for an instance.

루트 경로 트리(스냅숏 차이)Paths to Root tree (Snapshot diff)

루트 경로 트리는 형식 또는 인스턴스를 참조하는 개체의 체인을 보여 줍니다.The Paths to Root tree shows the chain of objects that reference the type or instance. .NET Framework 가비지 수집기는 개체에 대한 모든 참조가 해제된 경우에만 개체에 대한 메모리를 정리합니다.The .NET Framework garbage collector cleans up the memory for an object only when all references to it have been released.

차이 뷰의 인스턴스에 대한 루트 경로 트리Paths To Root tree for instances in a diff view

참조된 개체 트리(스냅숏 차이)Referenced Objects tree (Snapshot diff)

참조된 개체 트리는 기본 형식 또는 인스턴스가 참조하는 개체를 보여 줍니다.The Referenced Objects tree shows the objects that the primary type or instance references.

인스턴스에 대한 참조된 개체 트리Referenced Objjects tree for instances

개체 형식/인스턴스Object Type / Instance 유형 이름 또는 개체 인스턴스입니다.The name of the type or object instance.
크기(바이트)Size (Bytes) 인스턴스의 경우 인스턴스에 포함된 개체 크기를 제외한 기본 스냅숏의 개체 크기입니다.For an instance, the size of the object in the primary snapshot, excluding the size of objects contained in the instance.

유형의 경우 인스턴스에 포함된 개체 크기를 제외한 기본 스냅숏에 있는 유형의 총 인스턴스 크기입니다.For a type, the total size of the instances of the type in the primary snapshot, excluding the size of objects contained in the instance.
포함 크기(바이트)Inclusive Size (Bytes) 개체에 포함된 개체의 크기를 비롯한 기본 스냅숏의 개체 크기입니다.The size of the objects in the primary snapshot, including the size of objects contained in the objects.

참고 항목See also

JavaScript 메모리JavaScript memory
Visual Studio의 프로파일링Profiling in Visual Studio
프로파일링 기능 둘러보기Profiling feature tour
C++, C# 및 Visual Basic을 사용하는 UWP 앱의 성능 모범 사례 Performance best practices for UWP apps using C++, C#, and Visual Basic
Diagnosing memory issues with the new Memory Usage Tool in Visual Studio(Visual Studio에서 새 메모리 사용량 도구로 메모리 문제 진단)Diagnosing memory issues with the new Memory Usage Tool in Visual Studio