메모리 사용 분석Analyze Memory Usage

디버거 통합 메모리 사용량 진단 도구를 사용하여 디버그하는 동안 메모리 누수 및 비효율적인 메모리를 찾습니다.Find memory leaks and inefficient memory while you're debugging with the debugger-integrated Memory Usage diagnostic tool. 메모리 사용량 도구를 통해 관리되는 메모리 및 네이티브 메모리 힙의 스냅숏 을 하나 이상 만들 수 있습니다.The Memory Usage tool lets you take one or more snapshots of the managed and native memory heap. .NET, 네이티브 또는 혼합 모드(.NET 및 네이티브) 앱의 스냅숏을 수집할 수 있습니다.You can collect snapshots of .NET, native, or mixed mode (.NET and native) apps.

  • 단일 스냅숏을 분석하여 메모리 사용에 대한 개체 형식의 상대적 영향을 파악하고 앱에서 메모리를 비효율적으로 사용하는 코드를 찾을 수 있습니다.You can analyze a single snapshot to understand the relative impact of the object types on memory use, and to find code in your app that uses memory inefficiently.

  • 또한 앱의 스냅숏 두 개를 비교(diff)하여 코드에서 시간에 따라 메모리 사용이 늘어나는 영역을 찾을 수 있습니다.You can also compare (diff) two snapshots of an app to find areas in your code that cause the memory use to increase over time.

    다음 그림에서는 Visual Studio 2015 업데이트 1 이상 버전에서 사용할 수 있는 진단 도구 창을 보여 줍니다.The following graphic shows the Diagnostic Tools window (available in Visual Studio 2015 Update 1 and later versions):

    DiagnosticTools-Update1DiagnosticTools-Update1

    언제든지 메모리 사용량 도구에서 메모리 스냅숏을 수집할 수 있지만 Visual Studio 디버거를 사용하여 성능 문제를 조사하는 동안 응용 프로그램이 실행되는 방식을 제어할 수 있습니다.Although you can collect memory snapshots at any time in the Memory Usage tool, you can use the Visual Studio debugger to control how your application executes while investigating performance issues. 중단점 설정, 단계별 실행, 모두 중단 및 기타 디버거 작업은 가장 관련된 코드 경로를 중심으로 성능 조사를 수행하는 데 도움이 됩니다.Setting breakpoints, stepping, Break All, and other debugger actions can help you focus your performance investigations on the code paths that are most relevant. 앱이 실행되는 동안 이러한 작업을 수행하면 불필요한 노이즈를 코드에서 제거하고, 문제 진단에 걸리는 시간을 크게 줄일 수 있습니다.Performing those actions while your app is running can eliminate the noise from the code that doesn't interest you and can significantly reduce the amount of time it takes you to diagnose an issue.

    디버거 외부에서 메모리 도구를 사용할 수도 있습니다.You can also use the memory tool outside of the debugger. Memory Usage without Debugging을 참조하세요.See Memory Usage without Debugging.

참고

사용자 지정 할당자 지원 기본 메모리 프로파일러는 런타임 중 내보낸 할당 ETW 이벤트 데이터를 수집하여 작동합니다.Custom Allocator Support The native memory profiler works by collecting allocation ETW event data emitted by during runtime. CRT 및 Windows SDK의 할당자가 해당 할당 데이터를 캡처할 수 있도록 원본 수준에서 주석이 추가되었습니다.Allocators in the CRT and Windows SDK have been annotated at the source level so that their allocation data can be captured. 고유한 할당자를 작성하는 경우 myMalloc에 대한 다음 예제처럼 새로 할당된 힙 메모리에 대한 포인터를 반환하는 모든 함수를 __declspec(allocator)로 데코레이트할 수 있습니다.If you are writing your own allocators, then any functions that return a pointer to newly allocated heap memory can be decorated with __declspec(allocator), as seen in this example for myMalloc:

__declspec(allocator) void* myMalloc(size_t size)

메모리 사용량 데이터 수집Collect memory usage data

  1. Visual Studio에서 디버그할 프로젝트를 열고 메모리 사용량 검사를 시작할 지점에서 앱에 중단점을 설정합니다.Open the project you want to debug in Visual Studio and set a breakpoint in your app at the point where you want to begin examining memory usage.

    메모리 문제가 의심되는 영역이 있는 경우 메모리 문제가 발생하기 전에 첫 번째 중단점을 설정합니다.If you have an area where you suspect a memory issue, set the first breakpoint before the memory issue occurs.

    앱이 메모리를 자주 할당 및 할당 취소하는 경우 관심 있는 작업의 메모리 프로필을 캡처하는 것이 어려울 수 있으므로, 작업의 시작 및 끝에 중단점을 설정하거나 작업을 단계별로 실행하여 메모리가 변경된 정확한 지점을 찾습니다.Because it can be challenging to capture the memory profile of an operation that interests you when your app frequently allocates and de-allocates memory, set breakpoints at the start and end of the operation (or step through the operation) to find the exact point that memory changed.

  2. 의심되는 메모리 문제가 발생한 후 또는 분석할 함수 또는 코드 영역 끝에 두 번째 중단점을 설정합니다.Set a second breakpoint at the end of the function or region of code that you want to analyze (or after a suspected memory issue occurs).

  3. 끄지 않았다면 진단 도구 가 자동으로 나타납니다.The Diagnostic Tools window appears automatically unless you have turned it off. 창을 다시 표시하려면 디버그/Windows/진단 도구 표시를 클릭합니다.To bring up the window again, click Debug / Windows / Show Diagnostic Tools.

  4. 도구 모음의 도구 선택 설정에서 메모리 사용량을 선택합니다.Choose Memory Usage with the Select Tools setting on the toolbar.

    진단 도구 표시Show Diagnostics Tools

  5. 디버그/디버깅 시작을 클릭합니다(또는 도구 모음에서 시작 또는 F5 누름).Click Debug / Start Debugging (or Start on the toolbar, or F5).

    앱 로드가 완료되면 진단 도구의 요약 보기가 나타납니다.When the app finishes loading, the Summary view of the Diagnostics Tools appears.

    진단 도구 요약 탭Diagnostics Tools Summary Tab

    참고

    메모리 데이터를 수집할 경우 네이티브 또는 혼합 모드 앱의 디버깅 성능에 영향을 줄 수 있으므로 메모리 스냅숏은 기본적으로 사용되지 않습니다.Because collecting memory data can affect the debugging performance of your native or mixed-mode apps, memory snapshots are disabled by default. 네이티브 또는 혼합 모드 앱에서 스냅숏을 사용하도록 설정하려면 디버깅 세션을 시작합니다(바로 가기 키: F5 키).To enable snapshots in native or mixed-mode apps, start a debugging session (Shortcut key: F5). 진단 도구 창이 나타나면 [메모리 사용량] 탭을 선택한 다음 힙 프로파일링을 선택합니다.When the Diagnostic Tools window appears, choose the Memory Usage tab, and then choose Heap Profiling.

    스냅숏 사용Enable snapshots

    디버깅을 중지(바로 가기 키: Shift + F5)하고 다시 시작합니다.Stop (Shortcut key: Shift + F5) and restart debugging.

  6. 디버깅 세션의 시작 부분에 스냅숏을 만들려면 메모리 사용량 요약 도구 모음에서 스냅숏 만들기를 선택합니다.To take a snapshot at the start of your debugging session, choose Take snapshot on the Memory Usage summary toolbar. (이는 여기에 중단점을 설정하는 데도 도움이 될 수 있습니다.)(It may help to set a breakpoint here as well.)

    스냅숏 만들기Take snapshot

    메모리 비교 기준을 만들려면 디버깅 세션을 시작할 때 스냅숏을 만드는 것이 좋습니다.To create a baseline for memory comparisons, consider taking a snapshot at the start of your debugging session.

  7. 첫 번째 중단점이 발생할 시나리오를 실행합니다.Run the scenario that will cause your first breakpoint to be hit.

  8. 디버거가 첫 번째 중단점에서 일시 중지하는 동안 메모리 사용량 요약 도구 모음에서 스냅숏 만들기를 선택합니다.While the debugger is paused at the first breakpoint, choose Take snapshot on the Memory Usage summary toolbar.

  9. 두 번째 중단점까지 앱을 실행하려면 F5 키를 누릅니다.Hit F5 to run the app to your second breakpoint.

  10. 이제 다른 스냅숏을 만듭니다.Now, take another snapshot.

    이 시점에서 데이터 분석을 시작할 수 있습니다.At this point, you can begin to analyze the data.

메모리 사용량 데이터 분석Analyze memory usage data

메모리 사용량 요약 테이블의 행에는 디버깅 세션 중에 만든 스냅숏이 나열되고 더 자세한 보기에 대한 링크가 제공됩니다.The rows of Memory Usage summary table lists the snapshots that you have taken during the debugging session and provides links to more detailed views.

메모리 요약 테이블Memory summary table

열의 이름은 프로젝트 속성에서 선택한 디버깅 모드(.NET, 네이티브 또는 혼합(.NET 및 네이티브))에 따라 달라집니다.The name of the columns depend on the debugging mode you choose in the project properties: .NET, native, or mixed (both .NET and native).

  • 개체(차이)할당(차이) 열에는 스냅숏을 만들 때 .NET 및 네이티브 메모리의 개체 수가 표시됩니다.The Objects (Diff) and Allocations (Diff) columns display the number of objects in .NET and native memory when the snapshot was taken.

  • 힙 크기(차이) 열에는 .NET 및 네이티브 힙의 바이트 수가 표시됩니다.The Heap Size (Diff) column displays the number of bytes in the .NET and native heaps

여러 스냅숏을 만든 경우 요약 테이블의 셀에 행 스냅숏과 이전 스냅숏 간의 값 변경 내용이 포함됩니다.When you have taken multiple snapshots, the cells of the summary table include the change in the value between the row snapshot and the previous snapshot.

메모리 사용량을 분석하려면 메모리 사용량에 대한 자세한 보고서를 여는 다음 링크 중 하나를 클릭합니다.To analyze memory usage, click one of the links that opens up a detailed report of memory usage:

  • 현재 스냅숏과 이전 스냅숏 간의 차이 정보를 보려면 행의 왼쪽에 있는 변경 링크(메모리 사용량 증가)를 선택합니다.To view details of the difference between the current snapshot and the previous snapshot, choose the change link to the left of the arrow (Memory Usage Increase). 빨간색 화살표는 메모리 사용량 증가를 나타내고 녹색 화살표는 감소를 나타냅니다.A red arrow indicates an increase in memory usage, and a green arrow to indicates a decrease.

    메모리 문제를 더 빠르게 확인하기 위해 차이 보고서는 전체 수에서 가장 많이 증가한 개체 형식(개체(차이) 열의 변경 링크 클릭) 또는 전체 힙 크기에서 가장 많이 증가한 개체 형식(힙 크기(차이) 열의 변경 링크 클릭)별로 정렬됩니다.To help identify memory issues more quickly, the diff reports are sorted by object types that increased the most in overall number (click the change link in Objects (Diff) column) or that increased the most in overall heap size (click the change link in Heap Size (Diff) column).

  • 선택한 스냅숏의 세부 정보를 보려면 비변경 링크를 클릭합니다.To view details of only the selected snapshot, click the non-change link.

    보고서는 별도의 창에 나타납니다.The report appears in a separate window.

관리되는 형식 보고서Managed types reports

메모리 사용량 요약 테이블에서 개체(차이) 또는 할당(차이) 셀의 현재 링크를 선택합니다.Choose the current link of a Objects (Diff) or Allocations (Diff) cell in the Memory Usage summary table.

디버거 관리되는 형식 보고서 - 루트 경로Debugger managed type report - Paths to Root

위쪽 창에는 형식에서 참조되는 모든 개체의 크기(포함 크기)를 포함하여 스냅숏의 형식 개수 및 크기가 표시됩니다.The top pane shows the count and size of the types in the snapshot, including the size of all objects that are referenced by the type (Inclusive Size).

아래쪽 창의 루트 경로 트리에는 위쪽 창에서 선택한 형식을 참조하는 개체가 표시됩니다.The Paths to Root tree in the bottom pane displays the objects that reference the type selected in the upper pane. .NET Framework 가비지 수집기는 개체를 참조하는 마지막 형식이 해제된 경우에만 개체에 대한 메모리를 정리합니다.The .NET Framework garbage collector cleans up the memory for an object only when the last type that references it has been released.

참조 된 형식 트리에는 위쪽 창에서 선택한 형식이 보유하고 있는 참조가 표시됩니다.The Referenced Types tree displays the references that are held by the type selected in the upper pane.

관리되는 참조 형식 보고서 뷰Managed eferenced types report view

위쪽 창에서 선택한 형식의 인스턴스를 표시하려면 인스턴스 아이콘 아이콘을 선택합니다.To display the instances of a selected type in the upper pane, choose the Instance icon icon.

인스턴스 뷰Instances view

인스턴스 뷰에는 위쪽 창의 스냅숏에서 선택한 개체의 인스턴스가 표시됩니다.The Instances view displays the instances of the selected object in the snapshot in the upper pane. 루트 경로 및 참조된 형식 창에는 선택한 인스턴스를 참조하는 개체 및 선택한 인스턴스가 참조하는 형식이 표시됩니다.The Paths to Root and Referenced Types pane display the objects that reference the selected instance and the types that the selected instance references. 스냅숏이 만들어진 지점에서 디버거가 중지되면 값 셀을 마우스로 가리켜 도구 설명에 개체 값을 표시할 수 있습니다.When the debugger is stopped at the point where the snapshot was taken, you can hover over the Value cell to display the values of the object in a tool tip.

네이티브 형식 보고서Native type reports

진단 도구 창의 메모리 사용량 요약 테이블에서 할당(차이) 또는 힙 크기(차이) 셀의 현재 링크를 선택합니다.Choose the current link of a Allocations (Diff) or Heap Size (Diff) cell in the Memory Usage summary table of the Diagnostic Tools window.

네이티브 형식 뷰Native Type View

형식 뷰 에는 스냅숏의 형식 수와 크기가 표시됩니다.The Types View displays the number and size of the types in the snapshot.

  • 선택한 형식의 인스턴스 아이콘(개체 형식 열의 인스턴스 아이콘)을 선택하여 스냅숏에서 선택한 형식의 개체에 대한 정보를 표시합니다.Choose the instances icon (The instance icon in the Object Type column) of a selected type to display information about the objects of the selected type in the snapshot.

    인스턴스 뷰에는 선택한 형식의 각 인스턴스가 표시됩니다.The Instances view displays each instance of the selected type. 인스턴스를 선택하면 할당 호출 스택 창에 인스턴스를 만든 호출 스택이 표시됩니다.Selecting an instance displays the call stack that resulted in the creation of the instance in the Allocation Call Stack pane.

    인스턴스 뷰Instances view

  • 뷰 모드 에서 스택 뷰 를 선택하여 선택한 형식에 대한 할당 스택을 확인합니다.Choose Stacks View in the View Mode list to see the allocation stack for the selected type.

    스택 뷰Stacks View

변경(차이) 보고서Change (Diff) reports

  • 진단 도구 창의 메모리 사용량 탭에서 요약 테이블 셀의 변경 링크를 선택합니다.Choose the change link in a cell of the summary table of the Memory Usage tab on the Diagnostic Tools window.

    변경(차이) 보고서 선택Choose a change (dif)f report

  • 관리되는 보고서 또는 네이티브 보고서의 비교 대상 목록에서 스냅숏을 선택합니다.Choose a snapshot in the Compare To list of a managed or native report.

    비교 목록에서 스냅숏 선택Choose a snapshot from the Compare To list

    변경 보고서는 기본 스냅숏 값과 비교 스냅숏 간의 차이를 표시하는 열( (차이)로 표시됨)을 기본 보고서에 추가합니다.The change report adds columns (marked with (Diff)) to the base report that show the difference between the base snapshot value and the comparison snapshot. 네이티브 형식 뷰 차이 보고서가 표시되는 모양은 다음과 같습니다.Here's how a Native Type View diff report might look:

    네이티브 형식 Diff 뷰Native Types Diff Veiw

블로그 및 동영상Blogs and videos

Visual Studio 2015의 진단 도구 디버거 창Diagnostic Tools debugger window in Visual Studio 2015

블로그: Visual Studio 2015에서 디버그하는 동안 메모리 사용 도구Blog: Memory Usage Tool while debugging in Visual Studio 2015

Visual C++ 블로그: VS2015 Preview의 기본 메모리 진단Visual C++ Blog: Native Memory Diagnostics in VS2015 Preview

Visual C++ 블로그: Visual Studio 2015 CTP용 기본 메모리 진단 도구Visual C++ Blog: Native Memory Diagnostic Tools for Visual Studio 2015 CTP

참고 항목See Also

Visual Studio의 프로파일링Profiling in Visual Studio
프로파일링 기능 둘러보기Profiling Feature Tour