.NET オブジェクト割り当てツールを使用してメモリ使用量を分析する
.NET オブジェクト割り当てツールを使用すると、アプリが使用するメモリの量と、最も多くのメモリを割り当てるコード パスを確認できます。
ツールを実行すると、オブジェクトが割り当てられている関数の実行パスを確認できます。 その後、最も多くのメモリを占有している呼び出しツリーのルートに戻ってトレースできます。
.NET オブジェクト割り当てツールを使用してパフォーマンスを向上させる方法を示すチュートリアルについては、「ケース スタディ: コードの最適化に関する初心者向けガイド」を参照してください。
セットアップ
Alt + F2 を選択して、Visual Studio でパフォーマンス プロファイラーを開きます。
[.NET Object Allocation Tracking] チェック ボックス をオンにします。
スタート ボタンを選択してツールを実行します。
プロファイラーを開始する前に コレクションの一時停止 オプションを有効にした場合、診断セッション ビューで [レコード] ボタンを選択するまでデータは収集されません。
ツールの実行が開始されたら、アプリでプロファイリングするシナリオを実行します。 次に [収集 を停止] を選択するか、アプリを閉じてデータを表示します。
[割り当て] タブを選択します。次のようなメモリ割り当てデータが表示されます。
[割り当て] タブの
[割り当て] タブの
これで、オブジェクトのメモリ割り当てを分析できるようになりました。
収集中は、追跡ツールによってプロファイルされたアプリの速度が低下する可能性があります。 追跡ツールまたはアプリのパフォーマンスが低下し、すべてのオブジェクトを追跡する必要がない場合は、サンプリング レートを調整できます。 これを行うには、プロファイラーの概要ページで追跡ツールの横にある歯車記号を選択します。
の設定
の設定
サンプリング レートを目的のレートに合わせて調整します。 この変更は、収集と分析中のアプリのパフォーマンスを高速化するのに役立ちます。
ツールの効率を高める方法の詳細については、「Profiler 設定の最適化」を参照してください。
データを理解する
次のグラフィカル ビューでは、上部のグラフにアプリ内のライブ オブジェクトの数が表示されます。 下の オブジェクトデルタ グラフには、アプリ オブジェクトの変化率が表示されます。 赤いバーは、ガベージコレクションがいつ行われたかを示します。
のグラフ
時間範囲を選択することで、表形式データをフィルター処理して、指定した時間範囲のみのアクティビティを表示できます。 この操作を行うと、タブに表示される情報の範囲は、フィルター処理された時間範囲になります。
グラフを拡大または縮小することもできます。
割り当て
割り当て ビューには、メモリを割り当てるオブジェクトの場所と、それらのオブジェクトが割り当てられているメモリの量が表示されます。
割り当て ビューには、次の情報が表示されます。
Type 列は、メモリを占有するクラスと構造体の一覧です。 型をダブルクリックすると、そのバックトレースが逆呼び出しツリーとして表示されます。 割り当て ビューでのみ、選択したカテゴリ内のメモリを占有する項目を表示できます。
割り当て 列には、特定の割り当ての種類または関数内でメモリを占有するオブジェクトの数が表示されます。 この列は、割り当て、呼び出しツリー、および Functions ビューにのみ表示されます。
バイト と の平均サイズ (バイト) 列は、既定では表示されません。 それらを表示するには、[の種類] または [割り当て ] 列を右クリックし、[バイト数] を選択し、[平均サイズ (バイト)] オプションを してグラフに追加します。
2 つの列は、Total (Allocations) と Self (Allocations)に似ていますが、メモリを占有するオブジェクトの数ではなく、占有されたメモリの量が表示される点が異なります。 これらの列は、割り当て ビューにのみ表示されます。
モジュール名 列には、呼び出している関数またはプロセスを含むモジュールが表示されます。
これらの列はすべて並べ替え可能です。 タイプ と モジュール名 列では、項目を昇順または降順でアルファベット順に並べ替えることができます。 割り当て、バイト、および 平均サイズ (バイト)の場合は、数値を増減することで項目を並べ替えることができます。
シンボル
割り当て、呼び出しツリー、および 関数 タブに、次の記号が表示されます。
- 整数のような値型
- 整数の配列のような値型コレクション
- 文字列などの参照型
- 文字列の配列のような参照型コレクション
コール ツリー
呼び出しツリーの ビューには、多くのメモリを割り当てるオブジェクトを含む関数の実行パスが表示されます。
呼び出しツリーの ビューには、次の情報が表示されます。
- 関数名 列には、メモリを割り当てるオブジェクトを含む関数のプロセスまたは名前が表示されます。 表示は、検査するノードのレベルに基づいています。
- Total (Allocations) と Total Size (Bytes) 列には、割り当てられたオブジェクトの数と、関数と呼び出す他のすべての関数で使用されるメモリの量が表示されます。 合計サイズ (バイト) 列は、既定では非表示になっています。
- セルフ (割り当て) と Self-Size (バイト) 列には、割り当てられたオブジェクトの数と、選択した 1 つの関数または割り当ての種類で使用されるメモリの量が表示されます。
- 平均サイズ (バイト) 列には、割り当て ビューと同じ情報が表示されます。 この列は既定では非表示になっています。
- モジュール名 列には、呼び出している関数またはプロセスを含むモジュールが表示されます。
呼び出しツリーの ビューに表示されるその他のオプションは次のとおりです。
- ホット パスの展開 ボタンは、メモリを割り当てる多数のオブジェクトを含む関数実行経路を強調表示します。 アルゴリズムは、選択したノードから開始され、最も多くの割り当てのパスが強調表示され、調査に導きます。
- [ホット パスの表示] ボタンは、ホット パスの一部であるノードを示す炎の記号を表示または非表示にします。
関数
Functions ビューには、メモリを割り当てるプロセス、モジュール、および関数が表示されます。
Functions ビューに表示される情報には、次のものが含まれます。
[名] 列には、プロセスが最上位レベルのノードとして表示されます。 プロセスの下にはモジュールがあり、その下のモジュールは関数です。
次の列には、[割り当て] および [呼び出しツリー] ビューと同じ情報が表示されます。
- 合計(配分)
- 自己 (割り当て)
- 合計サイズ (バイト)
- セルフ サイズ (バイト)
- 平均サイズ (バイト)
徴収
コレクション ビューには、ガベージ コレクション中に収集または保持されたオブジェクトの数が表示されます。
画面
コレクション ビューに次の情報が表示されます。
- GC 列には、実行可能ファイルのライフサイクルにおけるこのガベージ コレクションの ID が表示されます。
- [世代] 列には、ガベージ コレクションの世代が表示されます。
- [GC の種類] 列には、ガベージ コレクションの種類が表示されます。
- [GC の理由] 列には、ガベージ コレクション イベントの理由が表示されます。
- [一時停止の期間] 列には、ガベージ コレクターでヒープを排他的に使用する必要があるため、実行がブロックされた時間が表示されます。 バックグラウンド ガベージ コレクションの場合、この値は小さくなります。
- [LOH サイズ] 列には、ガベージ コレクター実行後のラージ オブジェクト ヒープのサイズが表示されます。
- [POH サイズ] 列には、ガベージ コレクター実行後の固定されたオブジェクト ヒープのサイズが表示されます。
- [ファイナライズ可能な Surv (MB)] 列には、ガベージ コレクションで存続したファイナライザー (デストラクター) を持つオブジェクトの MB 数が表示されます。
- [固定されたオブジェクト] 列には、このガベージ コレクションによって昇格された、固定されたオブジェクトの数が表示されます。
- [収集済み] 列には、ガベージ コレクターによって収集されたオブジェクトの数が表示されます。
- [残り] 列には、ガベージ コレクターの実行後に残ったオブジェクトの数が表示されます。
行を選択すると、このビューには、収集されたオブジェクトと存続したオブジェクトを種類別に視覚化する円グラフも表示されます。
フィルタリングツール
割り当て、呼び出しツリー、および 関数の ビューには、すべて [マイ コードの表示] と [ネイティブ コードの表示] オプションとフィルター ボックスが含まれます。
- マイ コードのみを表示 は、システム、フレームワーク、およびその他の非ユーザー コードを [外部コード] フレームに折りたたんで、コードだけに集中できるようにします。 詳細については、「マイ コードのみ を使用してユーザー コードをデバッグするを参照してください。
- ネイティブ コードの表示 は、分析ターゲット内のネイティブ コードを表示し、非ユーザー コードを含めることができます。
- フィルター ボックスを使用すると、指定した値に基づいて Name または Function name 列をフィルター処理できます。 ボックスに文字列値を入力します。 その後、テーブルには、その文字列を含む型のみが表示されます。