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


Метод ICorProfilerCallback4::MovedReferences2

Вызывается для отчета о новом макете объектов в куче в результате сжатия сборки мусора. Этот метод вызывается, если профилировщик реализовал интерфейс ICorProfilerCallback4 . Этот обратный вызов заменяет метод ICorProfilerCallback::MovedReferences , так как он может сообщать больше диапазонов объектов, длина которых превышает то, что может быть выражено в ULONG.

Синтаксис

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

Параметры

cMovedObjectIDRanges [in] Количество блоков смежных объектов, перемещаемых в результате сжатия сборки мусора. То есть значение равно общему размеру cMovedObjectIDRangesoldObjectIDRangeStartnewObjectIDRangeStartмассивов, а cObjectIDRangeLength также массивам.

Следующие три аргумента MovedReferences2 являются параллельными массивами. Другими словами, 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])

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

Если профилировщик реализует интерфейсы ICorProfilerCallback иICorProfilerCallback4 , MovedReferences2 метод вызывается перед методом ICorProfilerCallback::MovedReferences , но только если MovedReferences2 метод успешно возвращается. Профилировщики могут возвращать HRESULT, указывающее на сбой метода MovedReferences2 , чтобы избежать вызова второго метода.

Требования

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

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

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

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

См. также