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