Метод 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]
+ (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.