次の方法で共有


プロファイル API でのガベージ コレクション

プロファイラーは、ガベージ コレクションの通知を受け取ることができます。

ユーザーが COR_PRF_MONITOR_GC フラグを指定した場合、ICorProfilerCallback::ObjectAllocated イベントを除くすべてのガベージ コレクション イベントがプロファイラーで発生します。 ObjectAllocated イベントは、パフォーマンス上の理由により、COR_PRF_MONITOR_OBJECT_ALLOCATED フラグによって明示的に制御されます。 COR_PRF_MONITOR_GC フラグを有効にすると、同時実行ガベージ コレクションがオフになることに注意してください。

.NET Framework Version 1.0 および 1.1 では、コード プロファイラーは ICorProfilerCallback::RuntimeSuspendFinished コールバックと ICorProfilerCallback::RuntimeResumeStarted コールバックを監視することによって、ガベージ コレクションが実行されていることを確認します (中断の理由が COR_PRF_SUSPEND_FOR_GC の場合)。 シャットダウン中は、共通言語ランタイム (CLR: Common Language Runtime) も中断され、コード プロファイラーに通知されないままガベージ コレクションが 1 回以上実行される場合があります。これは、ランタイムが既に中断状態になっているためです。 このような状況では、ガベージ コレクションの完了を検出することは容易ではありません。 コード プロファイラーは、ICorProfilerCallback::ObjectReferences コールバックまたは ICorProfilerCallback::RootReferences コールバックの後に発生する、最初の ObjectAllocated コールバックを検出する必要があります。

.NET Framework Version 2.0 以降のバージョンでは、コード プロファイラーは ICorProfilerCallback2::GarbageCollectionStarted コールバックおよび ICorProfilerCallback2::GarbageCollectionFinished コールバックを使用して、ガベージ コレクションが実行されていることを確認し、どのジェネレーションに対応しているかを識別できます。 ガベージ コレクションのジェネレーションの詳細については、COR_PRF_GC_GENERATION 列挙体を参照してください。 これらのコールバックには、前のセクションで説明したシャットダウンの問題はありません。

メモメモ

同時実行ガベージ コレクションは、Intel Itanium アーキテクチャ (以前の IA-64) を実装する 64 ビット システム上で WOW64 x86 エミュレーターを実行しているアプリケーションではサポートされません。64 ビットの Windows システムで WOW64 を使用する方法の詳細については、「Running 32-bit Applications」を参照してください。

ガベージ コレクションのブロッキング

共通言語ランタイムが ICorProfilerCallback インターフェイスの特定のメソッドを呼び出した場合、ランタイムはプロファイラーがその呼び出しから制御を戻すまでガベージ コレクションを実行できません。 これは、プロファイル サービスが、ガベージ コレクションに対して安全な状態でスタックを構築できるとは限らないためです。 代わりに、そのコールバックの間はガベージ コレクションが無効になります。 この場合、プロファイラーはできるだけ早く制御を戻す必要があります。 この状況は、次のコールバックで発生します。

また、次のコールバックでは、fIsSafeToBlock パラメーターを使用することにより、呼び出しごとにプロファイラーでガベージ コレクションをブロックできます。

プロファイラーがブロックを実行する場合、ガベージ コレクションは遅延することになります。 この遅延は、プロファイラーがガベージ コレクションをトリガーする CLR 関数を呼び出さない限り、または領域をマネージ ヒープに割り当てている限り、問題にはなりません。

参照

概念

プロファイリングの概要