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
[in] 因壓縮記憶體回收而移動之連續物件的區塊數目。 也就是說,cMovedObjectIDRanges 的值是 oldObjectIDRangeStart、newObjectIDRangeStart 和 cObjectIDRangeLength 陣列的總大小。MovedReferences 的以下三個引數是平行陣列。 換言之,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])
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