Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Вызывается для отчета о новом макете объектов в куче в результате сжатия сборки мусора. Этот метод вызывается, если профилировщик реализовал интерфейс 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