ICorProfilerCallback2::SurvivingReferences 方法

更新:2007 年 11 月

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

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 数组中引用的每个块指定一个大小。

备注

应对 objectIDRangeStart 和 cObjectIDRangeLength 数组的元素进行如下解释,以确定对象是否在垃圾回收后仍存在。假定某个 ObjectID 值 (ObjectID) 位于以下范围内:

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

对于位于以下范围中的 i 的任何值,对象在垃圾回收后继续存在:

0 <= i < cSurvivingObjectIDRanges

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

公共语言运行库 (CLR) 为非压缩垃圾回收调用 SurvivingReferences。对于压缩垃圾回收,则会改为调用 ICorProfilerCallback::MovedReferences。一个垃圾回收可以针对一代是压缩垃圾回收,而针对另一代是非压缩垃圾回收。对于任何特定代的垃圾回收,探查器将接收 SurvivingReferences 回调或 MovedReferences 回调,但不会同时接收两者。

在特定垃圾回收期间,可能会由于内部缓冲有限、在进行服务器垃圾回收时报告有多个线程以及其他原因而导致接收多个 SurvivingReferences 回调。在垃圾回收期间出现多个回调的情况下,信息会进行累积 — 在任何 SurvivingReferences 回调中报告的所有引用在垃圾回收后仍将存在。

要求

**平台:**请参见 .NET Framework 系统要求

**头文件:**CorProf.idl

**库:**CorGuids.lib

**.NET Framework 版本:**3.5 SP1、3.5、3.0 SP1、3.0、2.0 SP1、2.0

请参见

概念

分析 API 中的对象跟踪

参考

ICorProfilerCallback

ICorProfilerCallback2