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
的值是 objectIDRangeStart
和 cObjectIDRangeLength
陣列的大小,會為每個物件區塊分別存放 ObjectID
和長度。
SurvivingReferences2
的下兩個引數是平行陣列。 換句話說,objectIDRangeStart
和 cObjectIDRangeLength
會考量連續物件的相同區塊。
objectIDRangeStart
[in] ObjectID
值的陣列,其中每一個都是記憶體中連續即時物件之區塊的開始位址。
cObjectIDRangeLength
[in] 整數的陣列,其中每一個都是記憶體中連續物件之未被回收區塊的大小。
已為 objectIDRangeStart
陣列中被參考的每個區塊指定大小。
備註
objectIDRangeStart
和 cObjectIDRangeLength
陣列的項目應解譯如下,以判斷物件是否未被記憶體回收。 假定 ObjectID
的值 (ObjectID
) 位於下列範圍內:
ObjectIDRangeStart[i]
<= ObjectID
<ObjectIDRangeStart[i]
+ cObjectIDRangeLength[i]
針對任何位於下列範圍內的 i
之值,該物件尚未被記憶體回收:
0 <= i
<cSurvivingObjectIDRanges
非壓縮記憶體回收會回收「無作用」物件所佔用的記憶體,但是不會壓縮該釋放的空間。 因此,記憶體會傳回到堆積,但沒有移動「即時」物件。
針對非壓縮記憶體回收,Common Language Runtime (CLR) 會呼叫 SurvivingReferences2
。 針對壓縮記憶體回收,請改為呼叫 MovedReferences2。 單一記憶體回收可以為了某個層代而壓縮,但另一個則不壓縮。 對於在任何特定產生之上的記憶體回收,分析工具將接收 SurvivingReferences2
回呼或 MovedReferences2 回呼,但不可同時接收。
因為有限的內部緩衝區、伺服器記憶體回收期間的多重回呼和其他原因,在特定記憶體回收期間可能接收多重 SurvivingReferences2
回呼。 在記憶體回收期間多個回呼的情況下,資訊是累計的;在任何 SurvivingReferences2
回呼中被報告的所有參考不會被記憶體回收。
如果分析工具同時實作 ICorProfilerCallback 和 ICorProfilerCallback4 介面,則 SurvivingReferences2
方法會在 ICorProfilerCallback2::SurvivingReferences 方法之前呼叫,但僅於 SurvivingReferences2
成功傳回時才呼叫。 分析工具可傳回 HRESULT,表示 SurvivingReferences2
方法中的失敗,以避免呼叫第二個方法。
規格需求
平台:請參閱系統需求。
標頭: CorProf.idl、CorProf.h
程式庫:CorGuids.lib
.NET Framework版本:自 4.5 起可用