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
の値は oldObjectIDRangeStart
、newObjectIDRangeStart
、および 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]
+ (oldObjectID
– oldObjectIDRangeStart[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 以降で使用可能
関連項目
.NET