デバッガーなしのメモリ使用量Memory Usage without the 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.

    このトピックでは、メモリ使用量ツールを使って Windows Universal XAML アプリを分析する方法について説明します。This topic describes how use the Memory Usage tool to analyze a Windows Universal XAML app. JavaScript と HTML を使用する Windows ユニバーサル アプリでのメモリ使用量を分析する場合、「メモリ使用量の分析 (JavaScript)」を参照してください。If you want to analyze memory use in Windows Universal apps that use 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. アプリではさまざまな型のオブジェクトが大量に使われるため、1 つのシナリオを集中的に分析することをお勧めします。Because an app uses a large number of many types of objects, you might want to concentrate your analysis on one scenario. さらに、メモリの問題が起きる前にアプリのベースライン スナップショットを取り、初めて問題が起きた後でもう 1 回スナップショットを取り、さらにシナリオを反復できる場合は追加のスナップショットを 1 つ以上取ることをお勧めします。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. スナップショット ビューには次の 2 種類があります。There are two kinds of snapshot views:

手順 1Step 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.
手順 2Step 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.
手順 3Step 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. [ベースライン] というリンク テキストは、このスナップショットが診断セッションの最初のスナップショットであることを示します。[相違なし] は、差がゼロであることを示します。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.
手順 4Step 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. メモリ使用量ツールには 2 つのフィルターが定義されており、[マネージ ヒープ] ツリーと [ルートのパス] ツリーでこれらの型のほとんどを非表示にできます。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. 外部の型は、オペレーティング システムまたは Framework コンポーネントによって所有されるか、コンパイラによって生成されます。External types are owned by the operating system or by Framework components, or are generated by the compiler.

スナップショットの詳細レポートSnapshot details reports

診断セッションで得られた 1 つのスナップショットに注目する場合は、スナップショットの詳細レポートを使います。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
Visual Studio で新しいメモリ使用量ツールでメモリの問題を診断するDiagnosing memory issues with the new Memory Usage Tool in Visual Studio