Visual Studio でのメモリ使用のプロファイリングProfile memory usage in Visual Studio

デバッガーに統合されたメモリ使用量診断ツールを使用したデバッグ中に、メモリ リークおよび非効率的なメモリを見つけます。Find memory leaks and inefficient memory while you're debugging with the debugger-integrated Memory Usage diagnostic tool. メモリ使用量ツールを使うと、マネージド メモリ ヒープとネイティブ メモリ ヒープの 1 つまたは複数の "スナップショット" を取得して、オブジェクト型のメモリ使用量への影響を理解するのに役立てることができます。The Memory Usage tool lets you take one or more snapshots of the managed and native memory heap to help understand the memory usage impact of object types. .NET アプリ、ネイティブ アプリ、または混在モード (.NET とネイティブ) アプリのスナップショットを収集できます。You can collect snapshots of .NET, native, or mixed mode (.NET and native) apps.

次の図は、[診断ツール] ウィンドウ (Visual Studio 2015 Update 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. デバッグなしのメモリ使用量」を参照してください。See Memory Usage without debugging. Windows 7 以降ではアタッチされたデバッガーなしでプロファイル ツールを使用することができます。You can use the profiling tools with no debugger attached with Windows 7 and later. Windows 8 以降では、デバッガーを使用してプロファイル ツールを実行する必要があります ([診断ツール] ウィンドウ)。Windows 8 and later is required to run profiling tools with the debugger (Diagnostic Tools window).

Note

カスタム アロケーター サポート ネイティブ メモリ プロファイラーは、実行時に生成された割り当て 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. 独自のアロケーターを作成する場合、新しく割り当てられたヒープ メモリへのポインターを返すすべての関数は、__declspec(アロケーター) で修飾できます。myMalloc での例を次に示します。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)

このチュートリアルでは、次の作業を行います。In this tutorial, you will:

  • メモリのスナップショットの作成Take snapshots of memory
  • メモリ使用量データの分析Analyze memory usage data

メモリ使用量データの収集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.

    Tip

    アプリがメモリの割り当てと割り当て解除を頻繁に行う場合、目的とする操作のメモリ プロファイルを取得するのが容易ではないため、操作の最初と最後にブレークポイントを設定して (または操作をステップ実行して)、メモリが変更された正確なポイントを見つけます。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. 分析するコードの関数またはリージョンの終わりに (または疑わしいメモリの問題が発生したあとに) 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. もう一度ウィンドウを表示するには、[デバッグ] > [ウィンドウ] > [診断ツールの表示] の順にクリックします。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

    Note

    メモリ データの収集はネイティブ アプリや混在モードのアプリのパフォーマンスに影響する可能性があるため、既定でメモリのスナップショットは無効になっています。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

    Tip

    メモリ比較のベースラインを作成するには、デバッグ セッションの開始時に、スナップショットを取得することを検討します。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 キーを押すと、アプリケーションが 2 つ目のブレークポイントまで実行されます。Press 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.

メモリ使用量を分析するには、リンクを 1 つクリックして、メモリ使用量の詳細なレポートを開きます。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.

    Tip

    より迅速にメモリの問題を識別するために、Diff レポートは、総数が最も増加したオブジェクト型の順 ([オブジェクト (相違)] 列の変更リンクをクリック) や、総ヒープ サイズが最も増加したオブジェクト型の順 ([ヒープ サイズ (相違)] 変更リンクをクリック) に並べ替えられています。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 Objects pane displays 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

変更 (Diff) レポート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

    変更レポートを実行すると、基本のスナップショット値と比較のスナップショットの差分を表示する列 ( (Diff) のマークが付けられる) が、基本レポートに追加されます。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:

    ネイティブ型の差分ビューNative Types Diff Veiw

ブログとビデオBlogs and videos

ビデオのムービー カメラ アイコンmovie camera icon for video 診断ツールの使い方については、Visual Studio 2017 でのメモリ使用量と CPU 使用量を分析する方法がわかるこちらのビデオをご覧ください。Watch a video on using the diagnostics tools that shows how to analyze memory usage and CPU usage in Visual Studio 2017.

デバッグ中に CPU とメモリを分析するAnalyze CPU and Memory While Debugging

Visual C++ ブログ: Visual C++ 2015 でのメモリ プロファイルVisual C++ Blog: Memory Profiling in Visual C++ 2015

次の手順Next steps

このチュートリアルでは、メモリ使用量データを収集し、分析する方法について学習しました。In this tutorial, you've learned how to collect and analyze memory usage data. プロファイラーのツアーを既に完了している場合、自分のアプリの CPU 使用量を分析する方法を一読しておくことをお勧めします。If you already completed the tour of the profiler, you may want to get a quick look at how to analyze CPU usage in your apps.