Поделиться через


Метод 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])

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

Дополнительные сведения о способах отслеживания интерфейсом API для профилирования значений ObjectID см. в разделе Отслеживание объектов в интерфейсе API для профилирования.

Требования

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

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

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

Версии платформы .NET Framework: 4, 3.5 с пакетом обновления 1 (SP1), 3.5, 3.0 с пакетом обновления 1 (SP1), 3.0, 2.0 с пакетом обновления 1 (SP1), 2.0

См. также

Ссылки

Интерфейс ICorProfilerCallback

Другие ресурсы

Профилирующие интерфейсы

Профилирование (справочник по неуправляемым интерфейсам API)