ICorProfilerCallback::MovedReferences 方法

调用此方法可报告因压缩垃圾回收而在堆中形成的新对象布局。

HRESULT MovedReferences(
    [in]  ULONG  cMovedObjectIDRanges,
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] ULONG    cObjectIDRangeLength[] );

参数

  • cMovedObjectIDRanges
    [in] 因压缩垃圾回收而移动的连续对象块的数目。 也就是说,cMovedObjectIDRanges 的值是 oldObjectIDRangeStart、newObjectIDRangeStart 和 cObjectIDRangeLength 数组的总大小。

    MovedReferences 的后三个参数是平行的数组。 换句话说,oldObjectIDRangeStart[i]、newObjectIDRangeStart[i] 和 cObjectIDRangeLength[i] 都与单个连续对象块有关。

  • oldObjectIDRangeStart
    [in] 一个由 ObjectID 值构成的数组,其中的每个值都是内存中一个连续活动对象块的旧(垃圾回收前)起始地址。

  • newObjectIDRangeStart
    [in] 一个由 ObjectID 值构成的数组,其中的每个值都是内存中一个连续活动对象块的新(垃圾回收后)起始地址。

  • cObjectIDRangeLength
    [in] 一个由整数构成的数组,其中的每个整数都是内存中一个连续对象块的大小。

    对于在 oldObjectIDRangeStart 和 newObjectIDRangeStart 数组中引用的每个块,都会指定一个大小。

备注

压缩垃圾回收器将回收由死对象占用的内存,并压缩释放的空间。 这样,活动对象可能被移到该堆中,由以前的通知分发的 ObjectID 值就可能发生更改。

假定某个现有的 ObjectID 值 (oldObjectID) 位于以下范围内:

oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

在这种情况下,从范围起始处到对象起始处的偏移量如下所示:

oldObjectID - oldObjectRangeStart[i]

对于位于以下范围中的 i 的任何值:

0 <= i < cMovedObjectIDRanges

可以按如下方式计算新的 ObjectID:

newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])

在该回调本身中,由 MovedReferences 传递的任何 ObjectID 值都无效,因为垃圾回收可能正处于将对象从旧位置移到新位置的过程中。 因此,探查器不应在 MovedReferences 调用期间尝试检查对象。 ICorProfilerCallback2::GarbageCollectionFinished 回调指示已将所有对象移到它们的新位置,并且可以执行检查。

有关分析 API 如何跟踪 ObjectID 值的更多信息,请参见分析 API 中的对象跟踪

要求

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

**头文件:**CorProf.idl、CorProf.h

**库:**CorGuids.lib

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

请参见

参考

ICorProfilerCallback 接口

其他资源

分析接口

分析(非托管 API 参考)