次の方法で共有


ICorProfilerCallback4::SurvivingReferences2 メソッド

非圧縮ガベージ コレクションを実行した後の、ヒープ内のオブジェクトのレイアウトを報告します。 このメソッドは、プロファイラーが ICorProfilerCallback4 インターフェイスを実装している場合に呼び出されます。 このコールバックによって、ICorProfilerCallback2::SurvivingReferences メソッドが置き換えられます。ULONG で表現できる内容を超える長さの、より大きなオブジェクト範囲を報告できるためです。

構文

HRESULT SurvivingReferences2(  
    [in] ULONG  cSurvivingObjectIDRanges,  
    [in, size_is(cSurvivingObjectIDRanges)] ObjectID  
                objectIDRangeStart[] ,  
    [in, size_is(cSurvivingObjectIDRanges)] SIZE_T  
                cObjectIDRangeLength[] );  

パラメーター

cSurvivingObjectIDRanges
[in] 非圧縮ガベージ コレクションを実行した後に存続する、隣接したオブジェクトのブロック数。 つまり、cSurvivingObjectIDRanges の値は、objectIDRangeStart 配列と cObjectIDRangeLength 配列のサイズを表します。これらの配列にはそれぞれ、オブジェクトの各ブロックの ObjectID と長さが格納されます。

SurvivingReferences2 の次の2個の引数は並列配列です。 つまり、objectIDRangeStartcObjectIDRangeLength は隣接するオブジェクトの同じブロックを対象としています。

objectIDRangeStart
[in] それぞれがメモリ内の有効な隣接オブジェクト ブロックの開始アドレスを表す、ObjectID 値の配列。

cObjectIDRangeLength
[in] それぞれがメモリ内に存続する隣接オブジェクト ブロックのサイズを表す、整数の配列。

サイズは、objectIDRangeStart 配列内の参照される各ブロックに対して指定します。

解説

objectIDRangeStart 配列と cObjectIDRangeLength 配列の要素は、次のように解釈されて、ガベージ コレクションでオブジェクトが存続したかどうかを判断する必要があります。 ObjectID 値 (ObjectID) が次の範囲内にあるとします。

ObjectIDRangeStart[i]<= ObjectID<ObjectIDRangeStart[i] + cObjectIDRangeLength[i]

次の範囲内にある i のすべての値について、オブジェクトはガベージ コレクションの実行後に存続しています。

0 <= i<cSurvivingObjectIDRanges

非圧縮ガベージ コレクションは、"無効な" オブジェクトによって占有されているメモリをクリアしますが、解放された領域は圧縮しません。 そのため、メモリはヒープに返されますが、"有効な" オブジェクトは移動されません。

共通言語ランタイム (CLR: Common Language Runtime) は、非圧縮ガベージ コレクションに対して SurvivingReferences2 を呼び出します。 圧縮ガベージ コレクションの場合には、代わりに MovedReferences2 が呼び出されます。 単一のガベージ コレクションで 1 つのジェネレーションを圧縮できますが、その他のジェネレーションは非圧縮になります。 どの特定のジェネレーションのガベージ コレクションについても、プロファイラーは SurvivingReferences2 コールバックと MovedReferences2 コールバックのいずれかを受け取り、両方を受け取ることはありません。

特定のガベージ コレクションで複数の SurvivingReferences2 コールバックを受け取ることがあります。この原因としては、内部バッファリングの制限、サーバーのガベージ コレクション中の複数のコールバックなどが考えられます。 あるガベージ コレクションで複数のコールバックが生じる場合、情報が累積されます。つまり、SurvivingReferences2 コールバックで報告されるすべての参照は対象のガベージ コレクション後も存続します。

プロファイラーが ICorProfilerCallback インターフェイスと ICorProfilerCallback4 インターフェイスを実装すると、SurvivingReferences2 が正常に返される場合のみ、SurvivingReferences2 メソッドは ICorProfilerCallback2::SurvivingReferences メソッドの前に呼び出されます。 プロファイラーは HRESULT を返すことがあり、これは SurvivingReferences2 メソッドの失敗を示し、2 番目のメソッドが呼び出されません。

必要条件

:システム要件」を参照してください。

ヘッダー : CorProf.idl、CorProf.h

ライブラリ: CorGuids.lib

.NET Framework のバージョン: 4.5 以降で使用可能

関連項目