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