次の方法で共有


プロファイリングとランタイム通知 ID

更新 : 2007 年 11 月

ランタイム通知では、報告されたクラス、スレッド、アプリケーション ドメインなどの ID が示されます。これらの ID を使用すると、共通言語ランタイム (CLR: Common Language Runtime) に詳細情報を照会できます。各 ID は、項目を説明するメモリ内のブロックのアドレスです。ただし、プロファイラでは、ID を非透過的なハンドルとして扱う必要があります。プロファイル関数の呼び出しで無効な ID が使用されると、結果は未定義になります。多くの場合は、結果としてアクセス違反が発生します。プロファイラは、使用されている ID が有効であることを確認する必要があります。プロファイル API ではどのような種類の検証も実行されません。検証を実行するとオーバーヘッドが生じ、アプリケーションの実行速度が大幅に低下するためです。

プロファイル ID の特性

以下のセクションでは、プロファイル API の ID の特性について説明します。

一意性

ProcessID は、プロセスの有効期間中、システム全体で一意です。その他のすべての ID は、ID の有効期間中、プロセス全体で一意です。

階層構造とコンテインメント

ID は、プロセスの階層構造を反映した階層構造にまとめられています。プロセスにはアプリケーション ドメインが含まれています。アプリケーション ドメインにはアセンブリが、アセンブリにはモジュールが含まれています。モジュールにはクラスが、クラスには関数が含まれています。スレッドはプロセス内に含まれ、アプリケーション ドメイン間で移動できます。オブジェクトは多くの場合アプリケーション ドメイン内に含まれています。同時に複数のアプリケーション ドメインのメンバであるオブジェクトは、ごく少数です。プロセスの中にコンテキストが含まれています。

有効期間と安定性

特定のプロセス、アプリケーション ドメイン、アセンブリ、スレッド、またはオブジェクトが破棄、除去、または解放されるか終了すると、それに関連付けられた ID は無効になります。特定の ID が無効になると、その ID に含まれるすべての ID も無効になります。たとえば、アプリケーション ドメインがアンロードされると、AppDomainID が無効になります。アプリケーション ドメイン内のアセンブリ、モジュール、クラス、および関数に対応する AssemblyID、ModuleID、ClassID、および FunctionID も同時に無効になります。

特定の ID の有効期間と安定性は次のようになります。

アプリケーション ドメインのアフィニティ

ユーザーが作成した、プロセス内の各アプリケーション ドメインには AppDomainID があります。既定のドメインと、ドメイン中立のアセンブリを保持するために使用される特別な擬似ドメインにも AppDomainID があります。

アセンブリ、モジュール、クラス、関数、およびガベージ コレクタ ハンドルには、アプリケーション ドメインとのアフィニティがあります。つまり、アセンブリを複数のアプリケーション ドメインに読み込むと、アセンブリとそのすべてのモジュール、クラス、関数、およびガベージ コレクタ ハンドルはアプリケーション ドメインごとに異なる ID を持ち、各 ID に対する操作は関連付けられたアプリケーション ドメインでのみ有効になります。ドメイン中立のアセンブリは、前に説明した特別な擬似ドメインに含まれます。

特記事項

ObjectID を除くすべての ID は、非透過値として扱う必要があります。ほとんどの ID は自己記述的です。いくつかの ID について詳しく説明します。

  • ClassID はクラスを表します。ジェネリック クラスの場合は、完全にインスタンス化される型を表します。List<int>、List<char>、List<object>、および List<string> には、それぞれ独自の ClassID があります。List<T> はインスタンス化されない型であり、ClassID はありません。Dictionary<string,V> は、部分的にインスタンス化される型であり、ClassID はありません。

  • FunctionID は関数のネイティブ コードを表します。ジェネリック関数 (ジェネリック クラスの関数) の場合、複数のネイティブ コード インスタンス化により、特定の関数に対して複数の FunctionID が存在する可能性があります。ネイティブ コード インスタンス化は、異なる複数の型で共有できるため (たとえば、List<string> と List<object> の共有コード)、FunctionID が複数の ClassID に属する場合があります。

  • ObjectID はガベージ コレクトされたオブジェクトを表します。ObjectID は、プロファイラが ObjectID を受け取った時点におけるオブジェクトの現在のアドレスであり、ガベージ コレクションごとに変更できます。したがって、ObjectID 値は、受け取った時点から次回ガベージ コレクションの開始までの間のみ有効です。CLR には、プロファイラに対する内部オブジェクト トラッキング マップの更新通知も用意されています。これによりプロファイラは、複数のガベージ コレクションにわたって有効な ObjectID を維持できます。

  • GCHandleID は、ガベージ コレクションのハンドル テーブルのエントリを表します。GCHandleID は、ObjectID とは異なり、非透過の値です。ガベージ コレクション ハンドルは CLR 自体によって作成される場合があります。または、GCHandle 構造体を使用して作成できます (GCHandle 構造体はハンドルのみを表すことに注意してください。ハンドルは構造体に含まれていません)。

  • ThreadID はマネージ スレッドを表します。ホストがファイバ モードでの実行をサポートする場合は、いつ実行するのかに応じて、マネージ スレッドが別のオペレーティング システム スレッドに存在してもかまいません。

    Bb384619.alert_note(ja-jp,VS.90).gifメモ :

    ファイバ モード アプリケーションのプロファイルは、.NET Framework Version 2.0 ではサポートされていません。

参照

その他の技術情報

プロファイル API の共通機能

プロファイリングの概要

プロファイル (アンマネージ API リファレンス)