メモリ割り当てを分析する
メモリの割り当て ビューを使って、特定の時間間隔の割り当てを分析します。この区間でどんなオブジェクトが割り当てられ、どの関数がそれらを割り当てたかを調べることができます。 このビューでは、プロファイリングがまだ進捗中でも割り当てデータを表示できます。メモリスナップショットは必要ありません。
データ収集モード
dotMemory は、次の 2 つのモードのいずれかでメモリ割り当てデータを収集できます。
- サンプル化
(デフォルト、Windows のみ)dotMemory は制限付きの割り当てデータを収集します。オブジェクトを割り当てる各関数ごとに、おおよそのオブジェクトサイズのみを表示できます。 オブジェクト数に関する情報は利用できません。
サンプル化 モードの長所:
プロファイルされたアプリケーションの速度が低下することはありません。
プロファイラーがすでに実行中のアプリケーションに接続されている場合に使用できます。
データは ETW イベントに基づいているため詳細ではありません。割り当てイベントは、割り当てられたメモリのサイズが合計で 100KB を超えるたびにトリガーされます。 例: スレッドは、プロファイリング中に 5 つの 50 KB メモリブロックを割り当てます。 このような場合、dotMemory は 100 KB の割り当てを 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 タイプのサブシステムにはプロファイリングセッション中に行われたすべての呼び出しが含まれることは明らかです。 このような場合、分析したくないサブシステムを除外できます。
サブシステムを分析から除外するには
リストからサブシステムを選択します。
削除 を押すか、サブシステムを右クリックしてコンテキストメニューから 範囲から除外する を選択します。
dotMemory は除外されたサブシステムをグレー表示し、サブシステムリストの最後に配置します。
除外されたサブシステムを戻すには
サブシステムリストの最後までスクロールします。
除外するサブシステムを選択します。
削除 を押すか、サブシステムを右クリックしてコンテキストメニューから スコープに戻る を選択します。

