ガーベッジコレクション
ガーベッジコレクションフィルターは、GC が実行された時間間隔をフィルタリングすることによってガベージコレクション(GC)を分析するために使用されます。
ガーベッジコレクションフィルターの仕組みを理解するためには、基本的な GC の概念を理解しておく必要があります。
簡単なガベージコレクションの概念
デスクトップアプリケーションの場合、.NET フレームワークはいわゆるワークステーション GC モードを提供します。
ワークステーションガベージコレクションには、フォアグラウンドとバックグラウンドの 2 種類があります。
フォアグラウンド GC を実行するために、ガベージコレクタは、コレクションをトリガしたスレッドを除くすべての管理対象スレッドを中断します。これによりメインスレッドも中断され、UI がフリーズします。これは「純粋な」ブロッキング GC です。
バックグラウンド GC は別の GC スレッドによって実行され、最も負荷の高い Gen2 コレクション中に管理対象スレッドを一時停止しません。ただし、Gen0 および Gen1 コレクション中は管理対象スレッドを一時停止する必要があります。バックグラウンド GC には依然として短い「ブロッキング GC」間隔が含まれます。デフォルトでは、バックグラウンド GC はオンになっています。
サーバーアプリケーションには、特別なサーバー GC モードがあります。ワークステーション GC との主な違いは、サーバー GC モードでは、各論理プロセッサーが独自のマネージドヒープと個別の GC スレッドを持っていることです。dotTrace Viewer でのパフォーマンス分析の観点からは、バックグラウンド GC とサーバー GC の間に大きな違いはありません。
マイクロソフトラーンの GC タイプの詳細を参照してください。
特定のタイプの GC がいつ実行されるかを区別するために、dotTrace はガーベッジコレクション: タイプサブフィルターを提供します。
ガーベッジコレクション: タイプ
サブフィルターは、特定のタイプのコレクション間の合計 GC 時間の分布を示します。
ガベージコレクションを分析するには、このサブフィルターを使用します。理由、スレッド、コレクションを切り替えたメソッド。例: 重要なブロッキング GC 時間がある場合は、イベントフィルターを .NET メモリ割り当てに切り替えて、割り振られたメモリの量が最も多いスレッドを判別することが理にかなっています。おそらく、これらは GC をトリガーするスレッドです。
GC タイプ:
ブロッキング - ガベージコレクションをブロックします。GC を切り替えたスレッドを除くすべてのスレッドが中断されます。あなたの分析の主なサブジェクト。
バックグラウンド - 別の GC スレッドによって実行され、最も重い Gen2 コレクション中に管理対象スレッドを一時停止しません。過度のバックグラウンド GC も最適化の対象です。
背景中のブロック - バックグラウンド GC は、Gen2 収集中に他のスレッドを中断しません。それにもかかわらず、Gen0 および Gen1 コレクション(これはフル GC の不可避の部分です)では、管理対象スレッドを中断する必要があります。バックグラウンド GC は常にブロッキング GC 間隔が短いことを意味します。背景中のブロックタイプはこれらの間隔を除外します。
選択されたすべてのスレッドで合計された、対応するタイプの GC に費やされた合計時間。
選択された合計時間に対する、対応するタイプの GC に費やされた時間の割合。
ガベージコレクションを適用するには: 型フィルター
フィルターで目的の GC タイプを選択します。
GC タイプを選択すると、選択したタイプの GC が実行された時間間隔のデータのみが他のフィルターに表示されます。
dotTrace がガベージコレクション間隔を計算する方法を理解するために、この例を考えてみましょう。
サンプル
例: アプリケーションには、ユーザースレッド #1 とユーザースレッド #2 の 2 つのスレッドがあります。ある時点で、メモリを解放するために、ユーザースレッド #1 は Gen0、Gen1 のガベージコレクションのブロックを切り替えます(下ダイアグラムの A1 の間隔)。メモリがまだ足りないため、GC スレッドが作成されます。Gen0、Gen1 ブロッキングコレクション(C3)、および他のスレッドをブロックしない Gen2 コレクション(B3 および D3)を含むフル GC を実行します。
スレッドダイアグラムで 3 つのスレッドをすべて選択すると、フィルターは GC 時間を次のように計算します。
ガベージコレクション = A1 + B3 + C3 + D3
ガーベッジコレクション: ブロッキング = A1 + C3
ガーベッジコレクション: 背景 = B 3 + C 3 + D 3
ガーベッジコレクション: バックグラウンド中のブロッキング = C3
ガーベッジコレクションイベントに加えて、サブシステムの GC 待機サブシステムを使用して、選択した時間間隔でのガベージコレクションの量を評価することもできます。ガーベッジコレクションと GC 待機に示されている異なる時間値で混同しないでください。問題は、ガーベッジコレクションが実際に GC を実行したスレッドに対してのみ計算されるのに対し、GC 待機サブシステムの時間には、GC によってブロックされたすべてのスレッドのすべての待機が含まれます。上記の例では、GC 待機は次のように計算されます。
GC 待機 = A1 + A2 + C1 + C2 + C3
ガーベッジコレクション: 深さ
ガーベッジコレクション: 深さサブフィルターは、Gen0、Gen1、Gen2 ヒープコレクション間の GC 時間の分布を示します。
Gen1 コレクションは、常に Gen0 ヒープセグメントのコレクションも意味することに注意してください。Gen2 GC (フル GC とも呼ばれます) には、Gen1 コレクションと Gen0 コレクションが含まれています。Gen1 コレクション内で Gen0 コレクションを実行するために使用される時間は、Gen1 GC 時間に集約されます。Gen2 GC 時間には、それがトリガーする Gen0 および Gen1 コレクションの時間が含まれます。
ヒープセグメント名。
選択したすべてのスレッドで合計された、対応する深さの GC をブロックするために費やされた合計時間。
選択された合計時間に対する、対応する深度の GC をブロックするために費やされた時間のパーセンテージ。
ガベージコレクションを適用するには: 深度フィルター
フィルターで目的のヒープセグメント名を選択します。
ヒープセグメントを選択すると、選択した深度の GC が発生した時間間隔のデータのみが他のフィルターに表示されます。
関連ページ:
タイムライン
タイムラインウィンドウは、分析に関心のあるスレッドと時間間隔を視覚化して選択するために使用されます。ウィンドウは次のセクションで構成されています。プロセスの概要 – アプリケーションのアクティビティとイベントの概要ダイアグラム。スレッドダイアグラム – スレッドアクティビティダイアグラム。プロセスの概要:プロセスの概要ダイアグラムは、プロファイルされたアプリケーションに関連するアプリケーションアクティビティと意味のあるイベントを視覚化します。このダイアグラムを使用して、CPU 負荷が高い間隔、長い...
サブシステム
サブシステムフィルターを使用すると、特定のコールツリーの時間が、ユーザーとシステムコード、WPF、LINQ、コレクション、文字列などのさまざまなコンポーネントにどのくらい分散しているかをすばやく評価できます。サブシステムの仕組み:いくつかの例外 (下記の特別サブシステムを参照) を除いて、各サブシステムは、特定の名前空間またはアセンブリ内で行われた呼び出しを単純にグループ化します。例:、アセンブリで宣言されたメソッドのすべての呼び出しは、WPF サブシステムにグループ化されます。サブシステムフィ...
デバッグ出力
デバッグ出力フィルターは、アプリケーションがデバッグ出力に書き込むイベントを示します。システムメソッドを使用します (実際、dotTrace はシステム関数のすべての呼び出しを追跡します)。デバッグ出力を選択すると、呼び出しツリーは出力に書き込むメソッドのみを表示します。高度なデバッグにはデバッグ出力イベントを使用します。デバッグ出力: 文字列:サブフィルターは、特定のメッセージがデバッグ出力に送信されたポイントイベントをフィルターに掛けるために使用されます。デバッグ出力を適用するには: 文字...
例外
例外フィルターは、プロファイリング中にアプリで発生した例外に関するデータを示します。例: 例外が選択されている場合、呼び出しツリーは例外をスローしたメソッドを示します。例外イベントを選択して、例外とその発生源を分析します。例外イベントを選択した後、例外: タイプおよび例外: メッセージサブフィルターを使用して結果を微調整できます。例外: タイプ:フィルターは、例外の種類を表示し、対応するポイントイベントを除外します。このフィルターを使用して、指定されたタイプの例外のみをスローするスレッドおよびメ...