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
陣列中被參考的每個區塊。
備註
重要
對於在 64 位元平台上大於 4 GB 的物件,這個方法會報告大小為 MAX_ULONG
。 若要取得大於 4 GB 之物件的大小,請改用 ICorProfilerCallback4::MovedReferences2 方法。
壓縮記憶體回收行程會回收無作用物件所佔用的記憶體,且會壓縮釋放的空間。 如此一來,即時物件可能在堆積中移動,且先前通知所散發 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 回呼表示所有物件都已都移至其新位置,而且可以執行檢查。
規格需求
平台:請參閱系統需求。
標頭: CorProf.idl、CorProf.h
程式庫:CorGuids.lib
.NET Framework版本:自 2.0 起可用