ICorProfilerCallback4::SurvivingReferences2 方法

報告非壓縮記憶體回收造成的堆積中物件配置。 如果分析工具已實作 ICorProfilerCallback4 介面,則呼叫這個方法。 此回呼會取代 ICorProfilerCallback2::SurvivingReferences 方法,因為它會報告更大範圍的物件,超過在 ULONG 中能表示的長度。

語法

HRESULT SurvivingReferences2(  
    [in] ULONG  cSurvivingObjectIDRanges,  
    [in, size_is(cSurvivingObjectIDRanges)] ObjectID  
                objectIDRangeStart[] ,  
    [in, size_is(cSurvivingObjectIDRanges)] SIZE_T  
                cObjectIDRangeLength[] );  

參數

cSurvivingObjectIDRanges
[in] 非壓縮記憶體回收後未被回收的連續物件區塊數目。 也就是說,cSurvivingObjectIDRanges 的值是 objectIDRangeStartcObjectIDRangeLength 陣列的大小,會為每個物件區塊分別存放 ObjectID 和長度。

SurvivingReferences2 的下兩個引數是平行陣列。 換句話說,objectIDRangeStartcObjectIDRangeLength 會考量連續物件的相同區塊。

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

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

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

備註

objectIDRangeStartcObjectIDRangeLength 陣列的項目應解譯如下,以判斷物件是否未被記憶體回收。 假定 ObjectID 的值 (ObjectID) 位於下列範圍內:

ObjectIDRangeStart[i]<= ObjectID<ObjectIDRangeStart[i] + cObjectIDRangeLength[i]

針對任何位於下列範圍內的 i 之值,該物件尚未被記憶體回收:

0 <= i<cSurvivingObjectIDRanges

非壓縮記憶體回收會回收「無作用」物件所佔用的記憶體,但是不會壓縮該釋放的空間。 因此,記憶體會傳回到堆積,但沒有移動「即時」物件。

針對非壓縮記憶體回收,Common Language Runtime (CLR) 會呼叫 SurvivingReferences2。 針對壓縮記憶體回收,請改為呼叫 MovedReferences2。 單一記憶體回收可以為了某個層代而壓縮,但另一個則不壓縮。 對於在任何特定產生之上的記憶體回收,分析工具將接收 SurvivingReferences2 回呼或 MovedReferences2 回呼,但不可同時接收。

因為有限的內部緩衝區、伺服器記憶體回收期間的多重回呼和其他原因,在特定記憶體回收期間可能接收多重 SurvivingReferences2 回呼。 在記憶體回收期間多個回呼的情況下,資訊是累計的;在任何 SurvivingReferences2 回呼中被報告的所有參考不會被記憶體回收。

如果分析工具同時實作 ICorProfilerCallbackICorProfilerCallback4 介面,則 SurvivingReferences2 方法會在 ICorProfilerCallback2::SurvivingReferences 方法之前呼叫,但僅於 SurvivingReferences2 成功傳回時才呼叫。 分析工具可傳回 HRESULT,表示 SurvivingReferences2 方法中的失敗,以避免呼叫第二個方法。

規格需求

平台:請參閱系統需求

標頭: CorProf.idl、CorProf.h

程式庫:CorGuids.lib

.NET Framework版本:自 4.5 起可用

另請參閱