Метод 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
.
Комментарии
Важно!
Этот метод сообщает размеры как MAX_ULONG
для объектов с размером более 4 Гб на 64-разрядных платформах. Чтобы получить размер объектов, размер которых превышает 4 ГБ, используйте метод ICorProfilerCallback4::MovedReferences2 .
Сжатие сборки мусора без сжатия освобождает память, занятую "мертвыми" объектами, и сжимает это освобожденное пространство. В результате динамические объекты могут быть перемещены в кучу, и значения 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 указывает, что все объекты были перемещены в новое расположение и можно выполнить проверку.
Требования
Платформы: см. раздел Требования к системе.
Заголовок: CorProf.idl, CorProf.h
Библиотека: CorGuids.lib
версии платформа .NET Framework: доступно с версии 2.0