ICorProfilerCallback::MovedReferences メソッド
圧縮ガベージ コレクションの結果、ヒープ内のオブジェクトの新しいレイアウトを報告するために呼び出されました。
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
パラメーター
cMovedObjectIDRanges
[入力] 圧縮ガベージ コレクションの結果によって移動された連続するオブジェクトのブロック数。 つまり、cMovedObjectIDRanges の値は、oldObjectIDRangeStart、newObjectIDRangeStart、および cObjectIDRangeLength の各配列の合計サイズです。MovedReferences の次の 3 つの引数は並列配列です。 つまり、oldObjectIDRangeStart[i]、newObjectIDRangeStart[i]、および cObjectIDRangeLength[i] はすべて、連続するオブジェクトの単一のブロックに関係します。
oldObjectIDRangeStart
[入力] ObjectID 値の配列。各値は、メモリ内の連続するライブ オブジェクトのブロックの古い (ガベージ コレクション前) 開始アドレスです。newObjectIDRangeStart
[入力] ObjectID 値の配列。各値は、メモリ内の連続するライブ オブジェクトのブロックの新しい (ガベージ コレクション後) 開始アドレスです。cObjectIDRangeLength
[入力] 整数の配列。各整数は、メモリ内の連続するオブジェクトのブロックのサイズです。サイズは、oldObjectIDRangeStart 配列および newObjectIDRangeStart 配列内で参照されるブロックごとに指定されます。
解説
圧縮ガベージ コレクターは、"死んだ状態の" オブジェクトが使用するメモリをクリアし、その解放された領域を圧縮します。 その結果、ライブ オブジェクトがヒープ内で移動するため、前の通知で配布された ObjectID 値が変化する可能性があります。
既存の ObjectID 値 (oldObjectID) が次の範囲内にあるとします。
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
この場合、範囲の先頭からオブジェクトの先頭までのオフセットは次のようになります。
oldObjectID - oldObjectRangeStart[i]
i の各値の有効範囲は次のとおりです。
0 <= i < cMovedObjectIDRanges
次のようにして、新しい ObjectID を計算できます。
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
ガベージ コレクションは、以前の場所から新しい場所へオブジェクトを移動中である可能性があるため、コールバック自体の間は、MovedReferences が渡す ObjectID 値は無効です。 したがって、プロファイラーは MovedReferences の呼び出し中にオブジェクトを検査する必要はありません。 ICorProfilerCallback2::GarbageCollectionFinished コールバックは、すべてのオブジェクトが新しい場所に移動しているため、検査を実行できることを示します。
プロファイル API による ObjectID 値の追跡方法の詳細については、「プロファイル API でのオブジェクト追跡」を参照してください。
必要条件
プラットフォーム: 「.NET Framework システム要件」を参照
ヘッダー: CorProf.idl、CorProf.h
ライブラリ: CorGuids.lib
.NET Framework のバージョン: 4、3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0