Бөлісу құралы:


Метод 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] Количество блоков смежных объектов, перемещаемых в результате сжатия сборки мусора. То есть значение равно общему размеру cMovedObjectIDRangesoldObjectIDRangeStartnewObjectIDRangeStartмассивов, а cObjectIDRangeLength также массивам.

Следующие три аргумента MovedReferences являются параллельными массивами. Другими словами, oldObjectIDRangeStart[i]newObjectIDRangeStart[i]и cObjectIDRangeLength[i] все касаются одного блока смежных объектов.

oldObjectIDRangeStart [in] Массив значений ObjectID , каждый из которых является старым (предварительной сборкой мусора), начальным адресом блока смежных динамических объектов в памяти.

newObjectIDRangeStart [in] Массив значений, каждый из которых является новым (после сборки мусора) начальным адресом блока смежных ObjectID динамических объектов в памяти.

cObjectIDRangeLength [in] Массив целых чисел, каждый из которых является размером блока смежных объектов в памяти.

Размер указывается для каждого блока, на который ссылается ссылка в oldObjectIDRangeStart массивах и newObjectIDRangeStart массивах.

Замечания

Это важно

Этот метод сообщает о размерах MAX_ULONG объектов, превышающих 4 ГБ на 64-разрядных платформах. Чтобы получить размер объектов размером более 4 ГБ, используйте вместо этого метод 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])

Ни один из ObjectID переданных значений MovedReferences не является допустимым во время обратного вызова, так как сборка мусора может находиться в середине перемещения объектов из старых расположений в новые расположения. Поэтому профилировщики не должны пытаться проверять объекты во время MovedReferences вызова. Обратный вызов ICorProfilerCallback2::GarbageCollectionFinished указывает, что все объекты были перемещены в новые расположения и можно выполнить проверку.

Требования

Платформы: см. раздел Требования к системе.

Заголовок: CorProf.idl, CorProf.h

Библиотека: CorGuids.lib

Версии .NET Framework: Доступно с версии 2.0

См. также