共用方式為


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

請參閱

參考

ICorProfilerCallback 介面

其他資源

分析介面

分析 (Unmanaged API 參考)