Метод ICorProfilerCallback4::SurvivingReferences2
Предоставляет информацию о структуре объектов в куче в результате сборки мусора без сжатия. Этот метод вызывается, если профилировщик реализовал интерфейс ICorProfilerCallback4 . Этот обратный вызов заменяет метод ICorProfilerCallback2::SurvivingReferences , так как он может сообщать о больших диапазонах объектов, длина которых превышает то, что может быть выражено в ULONG.
Синтаксис
HRESULT SurvivingReferences2(
[in] ULONG cSurvivingObjectIDRanges,
[in, size_is(cSurvivingObjectIDRanges)] ObjectID
objectIDRangeStart[] ,
[in, size_is(cSurvivingObjectIDRanges)] SIZE_T
cObjectIDRangeLength[] );
Параметры
cSurvivingObjectIDRanges
[in] Количество блоков смежных объектов, оставшихся в результате сборки мусора без сжатия. То есть значение cSurvivingObjectIDRanges
является размером массивов objectIDRangeStart
и cObjectIDRangeLength
, в которых хранятся идентификаторы ObjectID
и длины каждого блока объектов соответственно.
Следующие два аргумента SurvivingReferences2
являются параллельными массивами. Иными словами, objectIDRangeStart
и cObjectIDRangeLength
относятся к одному и тому же блоку смежных объектов.
objectIDRangeStart
[in] Массив значений ObjectID
, каждое из которых является начальным адресом блока смежных активных объектов в памяти.
cObjectIDRangeLength
[in] Массив целых чисел, каждое из которых представляет размер оставшегося блока смежных объектов в памяти.
Размер указывается для каждого блока, ссылка на который имеется в массиве objectIDRangeStart
.
Комментарии
Для определения того, уцелел ли объект после сборки мусора, элементы массивов objectIDRangeStart
и cObjectIDRangeLength
должны интерпретироваться следующим образом. Предположим, что значение ObjectID
(ObjectID
) находится в следующем диапазоне:
ObjectIDRangeStart[i]
<= ObjectID
<ObjectIDRangeStart[i]
+ cObjectIDRangeLength[i]
При любом значении i
, находящемся в указанном ниже диапазоне, объект уцелел после сборки мусора.
0 <= i
<cSurvivingObjectIDRanges
Сборка мусора без сжатия освобождает память, занятую "мертвыми" объектами, но не сжимает освобожденное пространство. В результате этого память возвращается в кучу, но активные объекты не перемещаются.
Среда CLR вызывает метод SurvivingReferences2
для выполнения сборки мусора без сжатия. Для сжатия сборок мусора вызывается метод MovedReferences2 . Отдельная операция сборки мусора может предусматривать сжатие для одного поколения и не предусматривать — для другого. Для сборки мусора в любом конкретном поколении профилировщик получит обратный SurvivingReferences2
вызов или обратный вызов MovedReferences2 , но не оба.
Несколько обратных вызовов SurvivingReferences2
может быть получено в ходе определенной сборки мусора из-за ограниченной внутренней буферизации, нескольких обратных вызовов во время сборки мусора на сервере и по другим причинам. При получении нескольких обратных вызовов во время сборки мусора информация накапливается — все ссылки, сообщаемые в обратных вызовах SurvivingReferences2
, сохранятся после сборки мусора.
Если профилировщик реализует интерфейсы ICorProfilerCallback и ICorProfilerCallback4 , SurvivingReferences2
метод вызывается перед методом ICorProfilerCallback2::SurvivingReferences , но только в случае SurvivingReferences2
успешного возврата. Профилировщики могут возвращать значение HRESULT, указывающее на сбой метода SurvivingReferences2
, что позволяет избежать вызова второго метода.
Требования
Платформы: см. раздел Требования к системе.
Заголовок: CorProf.idl, CorProf.h
Библиотека: CorGuids.lib
версии платформа .NET Framework: доступно с версии 4.5