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


Метод 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] Количество блоков смежных объектов, перемещенных в результате сжатия сборки мусора. Таким образом значение cMovedObjectIDRanges представляет общий размер массивов oldObjectIDRangeStart, newObjectIDRangeStart и 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] + (oldObjectIDoldObjectIDRangeStart[i])

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

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

Требования

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

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

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

версии платформа .NET Framework: доступно с версии 4.5.

См. также раздел