ドミネーター
ドミネータービューを使用すると、アプリでメモリがどのように保持されているかを理解できます。たとえば、文字列がアプリのメモリのかなりの部分を消費していることがわかっています。ただし、おそらく、最適化の対象はこれらの文字列自体ではなく、格納するデータ構造です。ドミネータービューは、「誰がメモリを保持するか」という質問に答えます。これは、非効率的なメモリ使用を分析するときに非常に重要です。この質問に正しく答えるには、ドミネーターの概念を理解している必要があります。
支配者とは何ですか?
アプリのルートから B へのすべてのパスが A を通過する場合、オブジェクト A はオブジェクト B より優位になります。つまり、オブジェクト B は、オブジェクト A によってのみメモリに保持されます。A がガベージコレクションされた場合、B もガベージコレクションされます。例: 配列はその要素の優位子です (配列要素への他の参照がない場合)。

アプリのルートからオブジェクトへのパスが複数ある場合、非支配的または排他的に保持されないオブジェクトとみなされます。例: オブジェクト C がオブジェクト A と B によって保持され、A がガベージコレクションされた場合、C はメモリ内に残ります ( B によって参照されているため)。そのため、支配パスと保持パスの違いを理解することが重要です。
支配の道 – パス上のオブジェクトは、他の 1 つのオブジェクトによってのみ保持されます。
保持パス – パス上のオブジェクトは、任意の数の他のオブジェクトによって保持される場合があります。
ドミネータービューは 2 つの部分で構成されています。
ドミネーターツリー
右側のツリーには、選択したオブジェクトセットの支配者のツリーが表示されます。
ツリーは、ツリーヘッダーの対応するボタンで選択できる 2 つのモードで動作します。
ツリー : すべての支配ノードが表示されます。選択したツリーノードの支配パスに参加する支配者は太字で表示されます。
パス : 選択されたツリーノードの支配パスに参加する支配者のみが表示されます。
ドミネーターのリストは、以下の列で構成されています。
名前 | 説明 |
|---|---|
タイプ | 型名。 タイプ名に残された数字は、そのタイプのオブジェクトがいくつ保持されているかを示しています。例: 整数配列 A の一部の要素はまったく同じ方法で保持されますが(A-> 要素)、整数配列 B の要素には別の保持パスがあります(B-> 要素)。 |
保持されたバイト数 | 排他的に保持されるオブジェクトの全体サイズ(バイト単位)。 |
保持オブジェクト | ドミネーターが支配するオブジェクトの数。 |
チャートの視覚化
左側のサンバーストチャートは、ドミネーターツリーをグラフィカルに表現したものです。ドミネーターが保持するメモリが多いほど、中央の山括弧が大きくなります。
ドミネーターツリーの分析は、ノードを展開して保持されたバイト数列の数字を解釈する必要があるため、非常に複雑になることがあります。対照的に、サンバーストチャートを一目見るだけで、アプリ内の主なドミネーターと最大の構造を判断できます。関心のあるドミネーターをクリックすると、ツリー内のそのドミネーターの支配パスが表示されます。
サンバーストチャートがドミネーターツリーのデータをどのように表示するかをよりよく理解するには、以下の例を検討してください。
ズームイン / ズームアウト
特定の支配者のサブツリーをより詳細に見たい場合は、グラフの縮尺を変更することができます。
ドミネーターを拡大するには
以下のいずれか 1 つを実行します:
チャート内の対応する円弧をダブルクリックします。
ツリーのドミネーターをダブルクリックするか、ツリーを選択して Enter を押します。
支配者はチャートのルートになります。
ズームアウトするには
グラフの中心をクリックします。
サンプル

オブジェクトのフィルター
分析に関係のないオブジェクトをタイプ別にフィルタリングできます。
リストを絞り込む
希望する文字列パターンの入力を開始します。dotMemory は一致する文字列をハイライトします。
次のヒントを参考にすれば、より効率的な検索を行うことができます。
キャメルハンプを使用してください。例:
foは、System.Drawing.Font型とMS.Utility.FrugalObjectList型のオブジェクトを返します。ワイルドカードなどの特殊シンボルを使用してください。完全なリストは以下の表に示されています。
- 特殊シンボルとフィルターの例
シンボル
説明
サンプル
*ワイルドカード
*
セット内のすべてのオブジェクトsys.*.data
パターンに一致するすべてのタイプと名前空間。例:System.Data、System.Windows.Controls.Datagrid、System.Windows.Data.Bindingsys.*.data.
パターンに一致する名前空間のみたとえばSystem.Windows.Data.BindingなくSystem.Windows.Controls.Datagrid配列
[]配列のみを残す
str[]
それらの型または名前空間にstrを含む配列。例:String[][,
[,,
...
または
翻訳
翻訳
...指定されたまたはそれ以上の配列(角括弧が閉じていない場合)
str[,,
型または名前空間にstrを含む次元 3 以上の配列。例:String[,,]およびString[,,,]str[,,]
型または名前空間にstrを含む 3 次元配列。例:String[,,]!a結果から配列を除外する
!a str
型または名前空間にstrを含むオブジェクト(配列を除く)たとえばStringなくString[]汎用型引数
<ジェネリクス型引数を持つ型だけを残す
str<
その型または名前空間にstrを含み、総称型引数を持つオブジェクトのみ。たとえばFileStreamStorage<Char>なくList<String><str
その総称型引数にstrを含むオブジェクトのみ。たとえばList<String>なくFileStreamStorage<Char><,
<,,
...
または
翻訳
翻訳
...指定された数のジェネリクス型引数を持つオブジェクトのみを残す
fun<,,>
型または名前空間にfunを含み、3 つのジェネリクス型引数を持つオブジェクト。例:Func<String, Object, Object>fun<str,,task
型または名前空間にfunを含み、パターンに一致する 3 つの引数または汎用引数を持つオブジェクト。例:Func<Stream, IAsyncResult, TaskResult, EventArgs>!g検索範囲からジェネリクス型引数を除外する
!g str
その型または名前空間にstrを含むオブジェクト(総称型引数を持たない)。たとえばStringなくList<String>#c
#struct
#m
#nsタイプ、値タイプ、メソッド、名前空間で検索します。
#ns Feature
名前空間にFeatureを含むオブジェクト。
さらに分析するオブジェクトを選択する
ドミネータービューでは、さらに分析するために次の項目を選択できます。
特定のドミネーターが保持するオブジェクトを開くには
ドミネーターオブジェクトセットを開くには
分析されたオブジェクトセットによって排他的に保持されるオブジェクトを選択するには
関連ページ:
最初にユーザーインターフェースを確認する
dotMemory での作業は、ある種の犯罪捜査 (dotMemory によるメモリ分析) のようなものだと考えてください。ここでの主なアイデアは、データを収集し (1 つ以上のメモリスナップショット)、多数の容疑者 (問題を引き起こす可能性のある解析対象) を選ぶことです。まず容疑者のリストから始めて、このリストを絞り続けます。有罪判決を下すまで、1 人の容疑者が別の容疑者のところに連れて行ってくれるかもしれません。この分析コンセプト (調査範囲を大きなエンティティから小さなエンティティに絞り...
タイプ
タイプビューには、選択したオブジェクトセット内のオブジェクトのリストが表示されます。便宜上、すべてのオブジェクトはタイプ別にグループ化されています。リストの各行は特定のタイプを表します。セット内に存在するそのタイプのすべてのオブジェクトは、この行にカウントされます。タイプビューを使用すると、メモリを大量に消費するオブジェクトやメモリ内にあってはならないオブジェクトを識別できます。このリストは、次の列で構成されています。タイプ型名。オブジェクトカウント同じ種類のオブジェクトの数。バイト数オブジェク...
同様の保持
同様の保持ビューは、オブジェクトを保持パスの類似性によってグループ化します。各オブジェクトセットについて、ビューにはルートへの 2 つの最短パスが表示されます。dotMemory は、さまざまな最短パスの中から、互いに最も異なる 2 つのパスのみを選択することに注意してください。同様の保持ビューを使用すると、同じ型のオブジェクトが論理的にどこに属しているかを区別できます。例: 配列内の複数の変数は同じ保持パスを持ちますが、これは他の配列の変数とは異なります。同様の保持を使用して、オブジェクトがま...