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
数组中引用的每个块均有指定的大小。
注解
重要
此方法将 64 位平台上大于 4 GB 的对象的大小报告为 MAX_ULONG
。 要获取大于 4 GB 的对象大小,请改用 ICorProfilerCallback4::MovedReferences2 方法。
压缩垃圾回收器将收回由不活动对象占用的内存,但不会压缩释放的空间。 因此,可能在堆中移动活动对象,并且由以前的通知分发的 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 回调指示所有对象都已移到新位置,可以执行检查。
要求
平台:请参阅系统要求。
头文件: CorProf.idl、CorProf.h
库:CorGuids.lib
.NET Framework 版本:自 2.0 起可用