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


Метод 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

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