ICorProfilerCallback4::MovedReferences2 メソッド

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

構文

HRESULT MovedReferences2(  
    [in]  ULONG  cMovedObjectIDRanges,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] SIZE_T    cObjectIDRangeLength[] );  

パラメーター

cMovedObjectIDRanges
[in] 圧縮ガベージ コレクションを実行した後に移動される、隣接したオブジェクトのブロック数。 つまり、cMovedObjectIDRanges の値は oldObjectIDRangeStartnewObjectIDRangeStart、および cObjectIDRangeLength 配列の合計サイズです。

MovedReferences2 の次の 3 つの引数は並列配列です。 つまり、oldObjectIDRangeStart[i]newObjectIDRangeStart[i]cObjectIDRangeLength[i] はすべて、隣接するオブジェクトの同じブロックを対象としています。

oldObjectIDRangeStart
[in] それぞれがメモリ内の有効な隣接オブジェクト ブロックの古い (ガベージ コレクション実行前の) 開始アドレスを表す、ObjectID 値の配列。

newObjectIDRangeStart
[in] それぞれがメモリ内の有効な隣接オブジェクト ブロックの新しい (ガベージ コレクション実行後の) 開始アドレスを表す、ObjectID 値の配列。

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

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

解説

圧縮ガベージ コレクターは、無効なオブジェクトによって占有されているメモリを解放し、解放された領域を圧縮します。 その結果、ヒープ内で有効なオブジェクトが移動され、以前の通知で配布された ObjectID の値が変更されることがあります。

既存の ObjectID の値 (oldObjectID) が次の範囲内にあるとします。

oldObjectIDRangeStart[i]<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

この場合、範囲の開始からオブジェクトの開始までのオフセットは次のとおりです。

oldObjectID - oldObjectRangeStart[i]

i の値が次の範囲内にあるとします。

0 <= i<cMovedObjectIDRanges

この場合、新しい ObjectID は次のように計算できます。

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

ガーベッジ コレクションでオブジェクトが古い場所から新しい場所へ移動中の可能性があるため、コールバックの間は MovedReferences2 によって渡される ObjectID 値はすべて無効です。 このため、MovedReferences2 呼び出しの間、プロファイラーはオブジェクトを検査するべきではありません。 ICorProfilerCallback2::GarbageCollectionFinished コールバックは、すべてのオブジェクトが新しい場所に移動され、検査を実行できることを示します。

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

必要条件

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

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

ライブラリ: CorGuids.lib

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

関連項目