dotMemory 2026.1 Help

ドミネーター

ドミネーター ビューでは、アプリ内でメモリがどのように保持されているかを理解できます。 例えば、アプリで文字列がメモリの大部分を消費していることがわかります。 しかし、最適化の主な対象はこれらの文字列そのものではなく、それらを格納しているデータ構造であることが多いです。 ドミネーター ビューは「誰がメモリを保持しているのか」という疑問に答えます。これは非効率的なメモリ使用量を分析する際に非常に重要です。 この疑問に正しく答えるには、 ドミネーターという概念を知っておく必要があります。

支配者とは何ですか?

アプリのルートから B までのすべてのパスが A を通る場合、オブジェクト A はオブジェクト B をドミネートします。 言い換えると、オブジェクト B はオブジェクト A のみによってメモリに保持されています。 A がガベージコレクションされると、 B もガベージコレクションされます。 例えば、他に参照がない場合、配列はその要素のドミネーターです (配列要素に他の参照がない場合)。

オブジェクト保持例

アプリのルートからオブジェクトへのパスが複数ある場合、非支配的または 排他的に保持されないオブジェクトとみなされます。 例: オブジェクト C がオブジェクト AB によって保持され、 A がガベージコレクションされた場合、 C はメモリ内に残ります (B によって参照されているため)。 そのため、支配パスと保持パスの違いを理解することが重要です。

  • 支配の道 – パス上のオブジェクトは、他の 1 つのオブジェクトによってのみ保持されます。

  • 保持パス – パス上のオブジェクトは、任意の数の他のオブジェクトによって保持される場合があります。

ドミネーター ビューは 2 つの部分で構成されています。

ドミネーターツリー

右側のツリーには、選択したオブジェクトセットの 支配者のツリーが表示されます。

ツリーは、ツリーヘッダーの対応するボタンで選択できる 2 つのモードで動作します。

  • ツリー: すべての支配ノードが表示されます。 選択したツリーノードの支配パスに参加する支配者は 太字で表示されます。

  • パス: 選択されたツリーノードの支配パスに参加する支配者のみが表示されます。

ドミネーターのリストは、以下の列で構成されています。

命名

説明

タイプ

型名。

タイプ名に残された数字は、そのタイプのオブジェクトがいくつ保持されているかを示しています。 例: 整数配列 A の一部の要素はまったく同じ方法で保持されますが(A-> 要素)、整数配列 B の要素には別の保持パスがあります(B-> 要素)。

保持されたバイト数

排他的に保持されるオブジェクトの全体サイズ(バイト単位)。

保持オブジェクト

ドミネーターが支配するオブジェクトの数。

チャートの視覚化

左側のサンバーストチャートは、ドミネーターツリーをグラフィカルに表現したものです。 ドミネーターが保持するメモリが多いほど、中央の山括弧が大きくなります。

ドミネーターツリーの分析は、ノードを展開して 保持されたバイト数 列の数字を解釈する必要があるため、非常に複雑になることがあります。 対照的に、サンバーストチャートを一目見るだけで、アプリ内の主なドミネーターと最大の構造を判断できます。 関心のあるドミネーターをクリックすると、ツリー内のそのドミネーターの支配パスが表示されます。

サンバーストチャートがドミネーターツリーのデータをどのように表示するかをよりよく理解するには、 以下の例を検討してください。

ズームイン / ズームアウト

特定の支配者のサブツリーをより詳細に見たい場合は、グラフの縮尺を変更することができます。

ドミネーターを拡大するには

  • 次のいずれかを実行します。

    • チャート内の対応する円弧をダブルクリックします。

    • ツリーのドミネーターをダブルクリックするか、ツリーを選択して Enter を押します。

    支配者はチャートのルートになります。

ズームアウトするには

  • グラフの中心をクリックします。

サンプル例

支配者によるグループ化の例

オブジェクトのフィルター

分析に関係のないオブジェクトをタイプ別にフィルタリングできます。

リストを絞り込む

  • 希望する文字列パターンの入力を開始します。 dotMemory は一致する文字列をハイライトします。

次のヒントを参考にすれば、より効率的な検索を行うことができます。

  • キャメルハンプを使用してください。 例: fo は、 System.Drawing.Font 型と MS.Utility.FrugalObjectList 型のオブジェクトを返します。

  • ワイルドカードなどの 特殊シンボルを使用してください。 完全なリストは以下の表に示されています。

特別なシンボルとフィルターの例

シンボル

説明

サンプル例

*

ワイルドカード

*
セット内のすべてのオブジェクト

sys.*.data
パターンに一致するすべてのタイプと名前空間。 例: System.DataSystem.Windows.Controls.DatagridSystem.Windows.Data.Binding

sys.*.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 を含むオブジェクト。

さらに分析するオブジェクトを選択する

ドミネーター ビューでは、さらに分析するために次の項目を選択できます。

特定のドミネーターが保持するオブジェクトを開くには

  • 次のいずれかを実行します。

    • Alt を押したまま、ツリーまたはチャートのドミネーターをクリックします。

    • ドミネーターを右クリックし、コンテキストメニューで この支配パスを通じて保持されているオブジェクトを開く を選択します。

    その後、 [type_name] で保持されるオブジェクト 件名が 分析パスに追加され、目的のオブジェクトのリストが 型別にグループ化ビューに表示されます。

ドミネーターオブジェクトセットを開くには

  • 次のいずれかを実行します。

    • Shift(シフト) を押したまま、ツリーまたはチャートのドミネーターをクリックします。

    • ドミネーターを右クリックし、コンテキストメニューで このオブジェクトセットを開く を選択します。

    その後、 [type_name] の支配者 件名が 分析パスに追加され、目的のオブジェクトのリストが 型別にグループ化ビューに表示されます。

分析されたオブジェクトセットによって排他的に保持されるオブジェクトを選択するには

  • Open retained objectsこのセットによって保持されている開いているオブジェクト ボタンをクリックします。

    その後、 排他的に保持されるオブジェクト 件名が 分析パスに追加され、目的のオブジェクトのリストが 型別にグループ化ビューに表示されます。

2026 年 6 月 12 日