ICorProfilerCallback2::SurvivingReferences 方法

将堆中对象的布局报告为非压缩垃圾回收的结果。

语法

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

参数

cSurvivingObjectIDRanges
[in] 作为非压缩垃圾回收的结果而仍存在的连续对象块的数量。 即,cSurvivingObjectIDRanges 的值是 objectIDRangeStartcObjectIDRangeLength 数组的大小,分别存储每个对象块的 ObjectID 和长度。

SurvivingReferences 接来下的两个参数为并行数组。 即,objectIDRangeStartcObjectIDRangeLength 涉及同一连续对象块。

objectIDRangeStart
[in] ObjectID 值的数组,其中每个值均为内存中连续活动对象块的起始地址。

cObjectIDRangeLength
[in] 整数数组,其中每个整数均为内存中保留下来的连续对象块的大小。

objectIDRangeStart 数组中引用的每个块均指定了大小。

注解

重要

此方法将 64 位平台上大于 4 GB 的对象的大小报告为 MAX_ULONG。 对于大于 4 GB 的对象,请改为使用 ICorProfilerCallback4::SurvivingReferences2 方法。

应按以下方式解释 objectIDRangeStartcObjectIDRangeLength 数组的元素,以确定垃圾回收后对象是否仍存在。 假定 ObjectID 值 (ObjectID) 在以下范围内:

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

对于以下范围内 i 的任何值,此对象在垃圾回收后仍存在:

0 <= i<cSurvivingObjectIDRanges

非压缩垃圾回收将回收“死”对象占用的内存,但不会压缩释放的空间。 由此,内存返回到堆中,但“活”对象不会移动。

公共语言运行时 (CLR) 调用 SurvivingReferences 进行非压缩垃圾回收。 对于压缩垃圾回收,改为调用 ICorProfilerCallback::MovedReferences。 单个垃圾回收可针对一个生成进行压缩,而针对另一个生成不进行压缩。 对于任何特定代的垃圾回收,探查器均会收到 SurvivingReferences 回调或 MovedReferences 回调,但不会同时收到二者。

由于内部缓冲有限、服务器垃圾回收期间的多个线程报告以及其他原因,在特定的垃圾回收过程中,可能收到多个 SurvivingReferences 回调。 如果在垃圾回收期间收到多个回调,则信息是累积的 — 任何 SurvivingReferences 回调中报告的任何引用都将在垃圾回收后仍然存在。

要求

平台:请参阅系统要求

头文件: CorProf.idl、CorProf.h

库:CorGuids.lib

.NET Framework 版本:自 2.0 起可用

另请参阅