メモリ割り当てを分析する
メモリの割り当てビューを使用して、特定の時間間隔での割り当てを分析します。この間隔で割り当てられたオブジェクトと、これらのオブジェクトを割り当てた関数を調べます。ビューでは、プロファイリングが進行中の場合でも割り当てデータを表示できます。メモリスナップショットは必要ありません。
データ収集モード
dotMemory は、次の 2 つのモードのいずれかでメモリ割り当てデータを収集できます。
- サンプリング
(デフォルト、Windows のみ) dotMemory は限定された割り当てデータを収集します。オブジェクトを割り当てる関数ごとに、おおよそのオブジェクトサイズのみを表示できます。オブジェクト数に関する情報は利用できません。
サンプルモードの長所:
プロファイルされたアプリケーションの速度が低下することはありません。
プロファイラーがすでに実行中のアプリケーションに接続されている場合に使用できます。
データは ETW イベントに基づいているため、詳細ではありません。割り当てイベントは、割り当てられたメモリのサイズが合計で 100KB を超えるたびにトリガーされます。例: スレッドは、プロファイリング中に 5 つの 50KB メモリブロックを割り当てます。このような場合、dotMemory は 100KB の 2 つの割り当てのみを検出します。

- 全部
dotMemory は詳細な割り当てデータを収集します。これには、割り当てられたオブジェクトの正確なサイズとオブジェクト数が含まれます。
全部モードの短所:
プロファイルされたアプリケーションの速度が大幅に低下します。
プロファイラーがすでに実行中のアプリケーションに接続されている場合は使用できません。
これらのモードは、プロファイリングセッション中にいつでも切り替えることができます。フルアロケーションデータを分析する場合は、全部データ収集モードを目的の時間範囲で有効にする必要があることに注意してください。この範囲にサンプリングされたデータの間隔が含まれている場合、メモリの割り当てビューには、サンプリングされた割り振りデータのみが表示されます。

メモリ割り当てデータを取得する方法
任意の時間間隔でのメモリ割り当てを分析するには

プロファイリングセッションを開始するまたは既存のワークスペース(dotMemory 2021.1 以降で作成)を開きます。
取得する詳細データに応じて、サンプルまたは全部データ収集モードのいずれかを使用します。
タイムライングラフで、目的の時間間隔を選択します。
割り当て済み: ... MB リンクまたは
ボタンをクリックして、メモリの割り当てビューを開きます。
セッションの開始から特定のスナップショットまでのメモリ割り当てを分析する

メモリスナップショットで、必要なスナップショットを見つけて、メモリ割り当てをクリックします。

2 つのスナップショット間のメモリ割り当てを分析するには

メモリスナップショットで、必要なスナップショットを見つけ、スナップショットごとに比較に追加をクリックして、スナップショットの比較領域に追加します。
スナップショットの比較で、メモリ割り当てを表示するをクリックします。

タイプ

タイプビューは、オブジェクトリストとバックトレースツリーの 2 つの部分で構成されます。
オブジェクト一覧
リストには、オブジェクトの型ごとにグループ化された、選択した時間間隔で割り当てられたオブジェクトが表示されます。特定のタイプを選択して、どの関数がこのタイプのオブジェクトを割り当てたかを確認します。
名前 | 説明 |
|---|---|
タイプ | 型名。 |
オブジェクト | 同じ種類のオブジェクトの数。 |
バイト数 | オブジェクトの全体的な浅いサイズ(バイト単位)。 |
バックトレース
バックトレースツリーには、オブジェクトリストで現在選択されているオブジェクトを割り当てたすべての呼び出しツリーが表示されます。呼び出しは下から上に表示されます。呼び出しスタックの最後の呼び出しが最上位ノードになります。つまり、バックトレースは反転された呼び出しツリーです。
割り当てられたメモリの量(合計 / 自分のバイト)または割り当てられたオブジェクトの数(合計 / 独自のオブジェクト)でツリーをソートできます。並べ替えを切り替えるには、合計 / 所有 .. 列ヘッダーをクリックします。
合計 / 所有 .. 列は、特定の呼び出しツリー(合計)または特定の呼び出し(自分の)に割り当てられたメモリ(オブジェクト)の量を示します。
例:

set_Capacity メソッドは 149.80 MB(自分の)を割り当てました。このメソッドは、次の 2 つの呼び出しスタックから呼び出されました。
AddWithResizeメソッドを使用: 142.69 MBおよび
EnsureCapacityメソッドを使用: 7.11 MB
呼び出しツリーのどこで特定のメソッドが呼び出されるかを表示するには、メソッドを右クリックしてこのメソッドの出現箇所を「CallTree」に表示するを選択します。これにより、マージされたすべてのメソッド呼び出しを含む呼び出しツリーが表示されます。
メソッド

メソッドビューは、メソッドリスト、バックトレースツリー、割り当てられた上位 5 つのオブジェクトタイプのサンバーストダイアグラムの 3 つの部分で構成されます。
メソッドリスト
リストには、選択した時間間隔中に呼び出されたメソッドが表示されます。特定のメソッドを選択すると、そのメソッドによって割り当てられたオブジェクトタイプと、メソッドのバックトレースツリーが表示されます。リスト内の各メソッドは一意であり、すべての呼び出しスタックからのこのメソッドのすべての呼び出しを表すことに注意してください。
名前 | 説明 |
|---|---|
メソッド | メソッド名。 |
オブジェクト | メソッド呼び出しによって割り当てられたオブジェクトの数。 |
バイト数 | オブジェクトの全体的な浅いサイズ(バイト単位)。 |
バックトレース
バックトレースツリーには、メソッドリストで現在選択されているメソッドを呼び出したすべてのコールスタックが表示されます。呼び出しは下から上に表示されます。コールスタックの最後の呼び出しが最上位ノードになります。つまり、バックトレースは反転されたコールツリーです。
バックトレースツリーは、タイプビューのものと似ています。
呼び出しツリー

呼び出しツリービューには、選択した時間間隔のコールツリーが表示されます。呼び出しがオブジェクトを割り当てた場合、オブジェクトの型は呼び出しのツリーに表示されます。
合計 / 所有 .. 列は、特定の呼び出しツリー(合計)または特定の呼び出し(自分の)に割り当てられたメモリ(オブジェクト)の量を示します。
割り当てられたメモリの量(合計 / 自分のバイト)または割り当てられたオブジェクトの数(合計 / 独自のオブジェクト)でツリーをソートできます。並べ替えを切り替えるには、合計 / 所有 .. 列ヘッダーをクリックします。
コールツリーをフィルタリングするには、フィルターフィールドへの入力を開始します。フィルターを設定する方法の詳細
特定のメソッドのサブシステムを表示するには、メソッドを右クリックしてこのメソッドのサブシステムを表示するを選択します。
サブシステム

サブシステムは、特定の型、名前空間、アセンブリに属するすべてのメソッドをグループ化します。グループ化の種類を切り替えるには、テーブルの上部にあるタイプ、名前空間、アセンブリボタンを使用します。特定のアプリケーションコンポーネントが割り当てるメモリの量をすばやく把握するには、サブシステムビューを使用します。例: このビューは、新しく追加またはリファクタリングしたコードのメモリ割り当てを評価する場合に特に役立ちます。
各サブシステムには、呼び出しサブツリー全体(合計サイズ)によって作成されたすべてのオブジェクトが含まれます。例: コンソールアプリケーションでは、Program.Main() はアプリの呼び出しツリーの最上位ノードであるため、タイプ Program のサブシステムにはアプリケーションによって作成されたすべてのオブジェクトが含まれます。
サブシステムはマスター詳細ビューです。左側のテーブルでサブシステムを選択すると、右側に次の内容が表示されます。
選択したサブシステムのインスタンスによって割り当てられた上位 5 つのタイプ。
ほとんどのメモリを割り当てた、選択したサブシステムの上位 5 つのメソッド。
選択したサブシステムのマージされたコールツリー。
呼び出しがオブジェクトを割り当てた場合、オブジェクトの型は呼び出しのツリーに表示されます。
合計 / 所有 .. 列は、特定の呼び出しツリー(合計)または特定の呼び出し(自分の)に割り当てられたメモリ(オブジェクト)の量を示します。
割り当てられたメモリの量(合計 / 自分のバイト)または割り当てられたオブジェクトの数(合計 / 独自のオブジェクト)でツリーをソートできます。並べ替えを切り替えるには、合計 / 所有 .. 列ヘッダーをクリックします。
アプリケーション呼び出しツリーで特定のメソッドの場所を表示するには、メソッドを右クリックしてこのメソッドを「コールツリー」に表示するを選択します。
サブシステムを範囲から除外する
アプリケーションには、それ以上の分析には関係のないサブシステムが多数含まれています。例: アプリケーションが Application.Run() メソッドによって起動されると、System.Windows.Application タイプのサブシステムにはプロファイリングセッション中に行われたすべての呼び出しが含まれることは明らかです。このような場合、分析したくないサブシステムを除外できます。
サブシステムを分析から除外するには
リストからサブシステムを選択します。
Del を押すか、サブシステムを右クリックして、コンテキストメニューで範囲から除外するを選択します。
dotMemory は除外されたサブシステムをグレー表示し、サブシステムリストの最後に配置します。
除外されたサブシステムを戻すには
サブシステムリストの最後までスクロールします。
除外するサブシステムを選択します。
Del を押すか、サブシステムを右クリックして、コンテキストメニューでスコープに戻るを選択します。
関連ページ:
プロファイリングセッションを開始
デフォルトでは、dotMemory の開始点はホームページです。新しいプロファイリングセッションを開始したり、最近のセッションを開くことができます。アプリケーションのプロファイリングを開始するにはプロファイルするものを選択するで、実行構成を選択または作成します。プロファイルする方法を選択するで、プロファイリングオプションを指定します。プロファイリングを実行するで、開始をクリックします。すでに実行中のアプリケーションのプロファイリングを開始するにはプロファイルするものを選択する、実行中のプロセスで...
分析の概要
プロファイリングデータの収集が完了すると、dotMemory は分析の概要ページで新しいタブを開きます。分析の概要ページには、セッション中に収集されたデータに関する情報が表示されます。タイムライン、収集されたスナップショット、スナップショット比較領域、タイムライン:タイムライングラフは、プロファイリングプロセス中にアプリがメモリをどのように消費したかを示しています。タイムラインは、Gen0、Gen1、Gen2 ヒープ、ラージオブジェクトヒープ、ピン留めオブジェクトヒープのインスタントサイズを示...
タイプ
タイプビューには、選択したオブジェクトセット内のオブジェクトのリストが表示されます。便宜上、すべてのオブジェクトはタイプ別にグループ化されています。リストの各行は特定のタイプを表します。セット内に存在するそのタイプのすべてのオブジェクトは、この行にカウントされます。タイプビューを使用すると、メモリを大量に消費するオブジェクトやメモリ内にあってはならないオブジェクトを識別できます。このリストは、次の列で構成されています。タイプ型名。オブジェクトカウント同じ種類のオブジェクトの数。バイト数オブジェク...
ルートへの最短経路
ルートへの最短経路ビューグループは、アプリケーションのルートからインスタンスへの最短パス (各ルートの最短パス) を表示します。便宜上、dotMemory は、プレーンリスト(最短パス)とツリー(結合された最短経路)の 2 通りの方法でパスを表示します。特定の方法を選択するには、ビューのリストで対応するボタンをクリックします。ビューを使用してインスタンスの保存パスをインスペクションし、インスタンスの収集を妨げている原因を特定します。これは、排他的に保持されていないオブジェクトを調査する場合に役立...
スナップショットの比較
dotMemory のスナップショットを比較するには、2 つの方法があります。1 つのワークスペース内のスナップショットを比較する、異なるワークスペースのスナップショットの比較、それぞれの方法は、特定のユースケースに適しています。1 つのワークスペース内のスナップショットを比較する:1 つのセッション内で取得されたスナップショットを比較することは、「アプリでメモリリークの原因となるオブジェクトは何ですか ? 」という質問に直接答える便利な手法です。スナップショットを比較する考え方は非常に単純で...