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 的值是 oldObjectIDRangeStartnewObjectIDRangeStartcObjectIDRangeLength 陣列的總大小。

下面 MovedReferences2 的三個引數是平行陣列。 換句話說,oldObjectIDRangeStart[i]newObjectIDRangeStart[i]cObjectIDRangeLength[i] 全都會考量連續物件的單一區塊。

oldObjectIDRangeStart
[in] 一個 ObjectID 值的陣列,其中每一個都是記憶體中連續即時物件之區塊舊的 (記憶體回收前) 開始位址。

newObjectIDRangeStart
[in] 一個 ObjectID 值的陣列,其中每一個都是記憶體中連續即時物件之區塊新的 (記憶體回收後) 開始位址。

cObjectIDRangeLength
[in] 一個整數的陣列,其中每一個都是記憶體中連續物件區塊的大小。

已指定大小給 oldObjectIDRangeStartnewObjectIDRangeStart 陣列中被參考的每個區塊。

備註

壓縮記憶體回收行程會回收無作用物件所佔用的記憶體,且會壓縮釋放的空間。 如此一來,即時物件可能在堆積中移動,且先前通知所散發 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 回呼,表示所有物件都已都移至其新位置,而且可以執行檢查。

如果分析工具同時實作 ICorProfilerCallbackICorProfilerCallback4 介面,MovedReferences2 方法會在 ICorProfilerCallback::MovedReferences 方法之前被呼叫,但只在 MovedReferences2 方法成功傳回時才會如此。 分析工具可傳回 HRESULT,表示 MovedReferences2 方法中的失敗,以避免呼叫第二個方法。

規格需求

平台:請參閱系統需求

標頭: CorProf.idl、CorProf.h

程式庫:CorGuids.lib

.NET Framework版本:自 4.5 起可用

另請參閱