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