dotMemory 2025.3 ヘルプ

分析の概要

dotMemory: Analysis overview

プロファイリングデータの収集が完了すると、dotMemory は分析の概要ページで新しいタブを開きます。

分析の概要ページには、セッション中に収集されたデータに関する情報が表示されます。

タイムライン

Timeline

タイムライングラフは、プロファイリングプロセス中にアプリがメモリをどのように消費したかを示しています。タイムラインは、Gen0、Gen1、Gen2 ヒープ、ラージオブジェクトヒープ、ピン留めオブジェクトヒープのインスタントサイズを示す 4 つのグラフで構成されています。管理されていないメモリを表示するパラメーターを選択して、アンマネージメモリのサイズを示すグラフを追加することもできます。

タイムライングラフは、分析の開始点として適しています。

  • 特定の時点での正確なメモリヒープ値を表示するには、この時点のタイムライングラフをクリックします。

  • 時間間隔で割り当てられたメモリの量を確認するには、グラフで目的の間隔を選択します。この間隔で割り当てられたオブジェクトと、これらのオブジェクトを割り当てた関数の詳細を取得するには、割り当て済み: ... MB リンクをクリックします。これにより、メモリ割り当てビューが開きます。

  • どこから始めればよいかわからない場合は、リアルタイムインスペクションで結果を確認してください。詳細については、さらに参照してください。

リアルタイムインスペクション

プロファイリング中に、dotMemory はその場でメモリ割り当てデータを分析します。データを使用して、潜在的なメモリ割り当ての問題を自動的に検出します。

問題が検出されると、dotMemory はタイムライングラフの上部のリストに問題を表示します。問題が検出された特定の時間間隔を選択するには、リストから問題を選択します。

Real-time inspections

Gen0 で固定されたオブジェクト

場合によっては、たとえば、マネージドコードからアンマネージドコード (外部ライブラリなど) を操作するときに、アプリケーションがいわゆる固定オブジェクトを割り当てることがあります。このようなオブジェクトは、小さなオブジェクトヒープ内に「固定」されます。マネージドコードはこのようなオブジェクトの正確な位置に依存しているため、ヒープ内で移動することはできません。これにより、ガベージコレクターが小さなオブジェクトヒープを圧縮できないという悪影響が生じます。その結果、GC の頻度が増えて効率が悪くなり、アプリケーション全体のパフォーマンスが低下する可能性があります。

例: Gen0 には次のオブジェクトレイアウトがあります: [A][B][Pinned][C][D] オブジェクト [A] および [B] は、[Pinned] オブジェクトがヒープから削除されるまで収集できません。

dotMemory は、マネージヒープの Gen0 セグメントに固定されたオブジェクトの割り当てを自動的に検出できます。

固定されたオブジェクトの考えられる原因:

  • fixed ブロックを使用して、ピン留めされたオブジェクトを意図的に作成できます。

    unsafe { var buffer = new byte[2000]; fixed (byte* ptr = buffer) { ... } }
  • オブジェクトに GCHandle を作成して、ガベージコレクションを防止します。

    var buffer = new byte[2000]; var gCBuffer = GCHandle.Alloc(buffer, GCHandleType.Pinned);

可能な解決策:

  • 可能であれば、スタックの代わりにスタックにバッファを割り当てるために stackalloc を使用することを検討してください

    var buffer = stackalloc byte[2000];
  • バッファに固定されたオブジェクトが含まれている場合は、スモールオブジェクトヒープではなくラージオブジェクトヒープに割り当てる方が合理的です。これを行うには、バッファーを 84KB より大きくします。

高い GC 圧力

高い GC 圧力は、ガベージコレクションが頻繁に実行され、かなりの時間がかかる状況です。つまり、あるサンプルの特定の時間間隔で、ガベージコレクションに費やされた時間が全体の実行時間の 30% を超える場合。

典型的な原因:

  • プログラムは、ループ内のクロージャなど、短命のオブジェクトを多数作成します。

  • プログラムはメモリ不足に近いです。

考えられる解決策は、頻繁な割り当てを防ぐためにコードを修正することです。この一連のブログ投稿で、このような問題の例をさらに見つけることができます。

速い LOH 成長率

ラージオブジェクトヒープ(LOH)は、ラージオブジェクト(> 84 KB)を格納するマネージヒープの特別なセグメントです。dotMemory は、LOH の成長をリアルタイムで追跡します。LOH の成長が速すぎると、LOH が大幅に断片化され、OutOfMemory 例外がスローされる可能性があります。

典型的な原因:

DictionaryListHashSetStringBuilder などの動的サイズのコレクションには、次の詳細があります。コレクションサイズが現在の境界を超えると、.NET はコレクションのサイズを変更し、メモリ内のコレクション全体を再定義します。

考えられる解決策は、サイズ変更が必要な場合の数を減らすことです。必要なサイズを予測し、このサイズ以上でコレクションを初期化してください。

収集されたスナップショット

Collected snapshots

この領域には、プロファイリング中に収集されたすべてのスナップショットに関する短いレポートが含まれています。各レポートでは次のことが可能です。

  • * あなたのアプリによって要求されたメモリの総量についての詳細情報を取得します。合計値(灰色のバー)は以下から構成されています。

    • 管理されていないメモリ: 管理されたヒープ外に割り当てられ、ガベージコレクターによって管理されていないメモリ。通常、これは .NET CLR、動的ライブラリ、グラフィックスバッファーなどに必要なメモリです。このメモリ部分はプロファイラーで分析できません。

      管理されていないメモリを表示するチェックボックスをオフにすると、アンマネージメモリのサイズが合計値から差し引かれます。

    • 。合計額 (アウトライン付きの灰色のバー): 割り当てられたオブジェクト間の空き領域を含む、アプリによって使用されるマネージドヒープ内のメモリの量。詳細については、下のイメージを参照してください。

    • 使用される .NET (濃い灰色のバー): 空き領域を除く、アプリによって使用されるマネージドヒープ内のメモリの量。これは、.NET で操作できる唯一のメモリ部分です。

    Memory usage
  • スナップショット名をクリックしてスナップショットビューでスナップショットを開きます。

  • Rename ボタンを使用してスナップショットの名前を変更します。

  • 解析のためにヒープ内のすべてのオブジェクトを開きます([ オブジェクトのサイズ ] オブジェクトリンクを使用)。この場合、「すべてのオブジェクト」オブジェクトセットが型別にグループ化ビューで開かれます。

  • 分析のためにマークされたオブジェクトを開きます(マークされたオブジェクトリンクを使用)。「マークされたオブジェクト」オブジェクトセットがタイプビューで開かれます。セクションインスタンスにマークを付けるのオブジェクトのマーキングの詳細を参照してください。

  • プロファイリングセッションの開始からスナップショットを取得する瞬間までにアプリによって生成されたメモリ割り当てを表示します(メモリ割り当てリンクを使用)。トラフィックの分析のセクションで、メモリ割り当ての分析について詳しく学びましょう。

スナップショット比較領域

2 つのスナップショットを比較するには、比較領域にドラッグするか、各スナップショットの比較に追加をクリックします。スナップショットの比較方法の詳細については、セクションスナップショットの比較を参照してください。

2024 年 7 月 24 日

関連ページ:

メモリ割り当てを分析する

メモリの割り当てビューを使用して、特定の時間間隔での割り当てを分析します。この間隔で割り当てられたオブジェクトと、これらのオブジェクトを割り当てた関数を調べます。ビューでは、プロファイリングが進行中の場合でも割り当てデータを表示できます。メモリスナップショットは必要ありません。データ収集モード:dotMemory は、次の 2 つのモードのいずれかでメモリ割り当てデータを収集できます。サンプリング (デフォルト、Windows のみ) dotMemory は限定された割り当てデータを収集します。...

インスペクションビュー

このビューでは、現在のスナップショットでの状況の概要が簡単に表示されます。最大サイズダイアグラムこのダイアグラムは、「アプリ内でメモリの大部分を占めているオブジェクトは何か」という質問に答えます。特定の種類のオブジェクトによって占有されているメモリの量を示します。ダイアグラム上の項目をクリックすると、それが分析対象となり、タイプビューに移動します。最大保持サイズダイアグラムこのダイアグラムは、「アプリケーションの主要なオブジェクトは何ですか ? 」という質問に答えます。このダイアグラムには、ドミ...

GC ルートの分析

オブジェクトの保持パスは常に GC ルートで始まります。ガベージコレクターの観点から見ると、ルートは、収集してはいけない、または収集されないオブジェクトへの参照です。これにより、ルートが保持グラフを構築するための唯一の可能な開始点になります。ルートタイプを理解することは、「誰がオブジェクトを保持するか ? 」を検討する際に不可欠となる場合があります。分析。保持パスを調べても、オブジェクトがまだメモリ内にある理由がわからない場合があります。この場合、GC ルートを調べることは理にかなっています。例...

タイプ

タイプビューには、選択したオブジェクトセット内のオブジェクトのリストが表示されます。便宜上、すべてのオブジェクトはタイプ別にグループ化されています。リストの各行は特定のタイプを表します。セット内に存在するそのタイプのすべてのオブジェクトは、この行にカウントされます。タイプビューを使用すると、メモリを大量に消費するオブジェクトやメモリ内にあってはならないオブジェクトを識別できます。このリストは、次の列で構成されています。タイプ型名。オブジェクトカウント同じ種類のオブジェクトの数。バイト数オブジェク...

インスタンスを分析する

特定のオブジェクトインスタンスを分析することは、調査の重要なステップです。dotMemory は、インスタンス分析に特化したビューをいくつか提供します。発信参照、キー保持パス、着信参照、ルートへの最短経路、作成スタックトレース、ビューを選択する:オブジェクトインスタンスのビューを選択するには、ビューリスト内の対応する項目をクリックします。インスタンスにマークを付ける:インスタンスをマークすることは、さまざまなビューやスナップショットで特定のインスタンスをすばやく見つけることができる便利なメカ

スナップショットの比較

dotMemory のスナップショットを比較するには、2 つの方法があります。1 つのワークスペース内のスナップショットを比較する、異なるワークスペースのスナップショットの比較、それぞれの方法は、特定のユースケースに適しています。1 つのワークスペース内のスナップショットを比較する:1 つのセッション内で取得されたスナップショットを比較することは、「アプリでメモリリークの原因となるオブジェクトは何ですか ? 」という質問に直接答える便利な手法です。スナップショットを比較する考え方は非常に単純で...