dotMemory 2019.1ヘルプ

ドミネーターによるグループ

ドミネーターによるグループビューを使用すると、アプリでメモリがどのように保持されるかを理解できます。例:あなたのアプリのメモリの大部分が文字列によって消費されることを知っています。それにもかかわらず、ほとんどの場合、最適化の対象はこれらの文字列自体ではなく、格納するデータ構造です。ドミネーターによるグループビューは、「だれがメモリを保持する」という質問に答えます。これは、無効なメモリ使用量を分析するときに非常に重要です。この質問に正しく答えるためには、支配者の概念に精通している必要があります。

支配者とは何ですか?

アプリケーションのルートからBへのすべてのパスがAを通過する場合、オブジェクトA オブジェクトBを支配します。つまり、オブジェクトBはオブジェクトAによって排他的にメモリに保持されます。Aがガベージコレクションの場合、Bもガベージコレクションされます。例:配列はその要素を支配する要素です(他の配列要素への参照がない場合)。

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

ドミネーターによるグループビューは2つの部分で構成されています。

Dominatorsの木

右側のツリーは、選択したオブジェクトセットの支配者のツリーを示しています。

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

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

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

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

名前

説明

タイプ名。<br>型名の左にある数字は、その型のオブジェクトの数がそのように保持されていることを示します。例:整数Aの配列の要素はまったく同じ方法(A - >要素)で保持されますが、整数配列Bの要素は別の保持パス(B - >要素)を持ちます。

保持されたバイト数

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

保持されたオブジェクト

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

サンバーストチャート

左のサンバーストチャートは、ドミネーターツリーの図です。支配者が保持するメモリが多いほど、中心角が大きくなります。

ドミネーターツリーの分析は、ノードを拡張して保持されたバイト数列の数値を解釈する必要があるため、かなり複雑になる可能性があります。これとは対照的に、サンバーストチャートを一目で確認することで、アプリのメインドミネーターと最大の構造を特定することができます。興味のあるドミネーターをクリックすると、ツリー内の支配的なパスが表示されます。

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

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

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

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

  • 以下のいずれか 1 つを実行します:

    • チャート内の対応する円弧をダブルクリックするか、コンテキストメニューからズームインを選択します。

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

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

ズームアウトするには

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

サンプル

Group by Dominators example

オブジェクトのフィルタリング

分析に関心のないオブジェクトを除外することができます。

リストを絞り込む

  • フィルターフィールドに目的のタイプ名を入力し始めます。

    dotMemoryは、パターンと一致しないすべてのインスタンスを除外します。

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

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

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

シンボル

説明

サンプル

*

ワイルドカード

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

sys.*.data
パターンと一致するすべての型と名前空間。例: System.DataSystem.Windows.Controls.Datagrid、および System.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>

さらなる分析のためのオブジェクトの選択

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

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

  • 以下のいずれか 1 つを実行します:

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

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

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

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

  • 以下のいずれか 1 つを実行します:

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

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

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

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

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

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

最終更新日: 2019年5月31日

関連事項

関連ページ:

最初にユーザーインターフェースを確認する

dotMemoryでの作業は、ある種の犯罪捜査 (dotMemoryによるメモリ分析) のようなものだと考えてください。ここでの主なアイデアは、データを収集し (1 つ以上のメモリースナップショット)、多数の容疑者 (問題を引き起こす可能性のある解析対象) を選ぶことです。まず容疑者のリストから始め...

型別にグループ化

型別にグループ化ビューには、選択したオブジェクトセット内のオブジェクトのリストが表示されます。便宜上、すべてのオブジェクトはタイプによってグループ化されます。リストの各行は特定のタイプを表します。セットに存在するそのタイプのすべてのオブジェクトは、この行でカウントされます。型別にグループ化ビューを使...

同様の保持によるグループ

同様の保持によるグループビューは、保存パスの類似性によってオブジェクトをグループ化します。オブジェクトセットごとに、ビューにはルートへの最短パスが2つ表示されます。dotMemoryは、さまざまな最短パスの中から、互いに最も異なる2つのパスのみを選択します。同様の保持によるグループビューでは、同じタ...

ビューの凡例

すべてのビュー:名前空間アセンブリーインターフェースインターフェースの配列

最短経路によるグループ

最短経路によるグループビューには、選択したオブジェクトセットの最短保持パスが表示されます。複数のルートからオブジェクトにアクセスできる場合、dotMemoryは最も近いルートまでのパスを1つだけ表示します。他のすべてのパスは、簡単にするために破棄されます。このビューを使用すると、オブジェクトがどのよ...

世代別グループ

分析するオブジェクトセットによってビューは異なります。スナップショットですべてのオブジェクトを調べると、ビューには各ヒープの断片化に関する追加情報がいくつかあります。このセクションの次のセクションで詳細を参照してください。世代別グループビューには、選択したセットのオブジェクトが世代間でどのように分散...