Compartilhar via


Método ICorProfilerCallback4::SurvivingReferences2

Relata o layout de objetos no heap como resultado de uma coleta de lixo não compactado. Esse método será chamado se o criador de perfil tiver implementado a interface ICorProfilerCallback4. Esse retorno de chamada substitui o método ICorProfilerCallback2::SurvivingReferences, porque ele pode relatar intervalos maiores de objetos cujos comprimentos excedem o que pode ser expresso em um ULONG.

Sintaxe

HRESULT SurvivingReferences2(  
    [in] ULONG  cSurvivingObjectIDRanges,  
    [in, size_is(cSurvivingObjectIDRanges)] ObjectID  
                objectIDRangeStart[] ,  
    [in, size_is(cSurvivingObjectIDRanges)] SIZE_T  
                cObjectIDRangeLength[] );  

Parâmetros

cSurvivingObjectIDRanges
[in] O número de blocos de objetos contíguos que sobreviveram como resultado da coleta de lixo não compactada. Ou seja, o valor de cSurvivingObjectIDRanges é o tamanho das matrizes objectIDRangeStart e cObjectIDRangeLength, que armazenam um ObjectID e um comprimento, respectivamente, para cada bloco de objetos.

Os dois próximos argumentos de SurvivingReferences2 são matrizes paralelas. Em outras palavras, objectIDRangeStart e cObjectIDRangeLength dizem respeito ao mesmo bloco de objetos contíguos.

objectIDRangeStart
[in] Uma matriz de valores de ObjectID, cada um deles é o endereço inicial de um bloco de objetos dinâmicos contíguos na memória.

cObjectIDRangeLength
[in] Uma matriz de inteiros, cada um deles é o tamanho de um bloco sobrevivente de objetos contíguos na memória.

Um tamanho é especificado para cada bloco referenciado na matriz objectIDRangeStart.

Comentários

Os elementos das matrizes objectIDRangeStart e cObjectIDRangeLength devem ser interpretados da seguinte maneira para determinar se um objeto sobreviveu à coleta de lixo. Suponha que um valor de ObjectID (ObjectID) esteja dentro do seguinte intervalo:

ObjectIDRangeStart[i]<= ObjectID<ObjectIDRangeStart[i] + cObjectIDRangeLength[i]

Para qualquer valor de i que esteja no intervalo a seguir, o objeto sobreviveu à coleta de lixo:

0 <= i<cSurvivingObjectIDRanges

Uma coleta de lixo não compactada recupera a memória ocupada por objetos "mortos", mas não compacta esse espaço liberado. Como resultado, a memória é retornada para o heap, mas nenhum objeto "ao vivo" é movido.

O CLR (Common Language Runtime) exige SurvivingReferences2 para coletas de lixo não compactadas. Para compactar coletas de lixo, MovedReferences2 será chamado em vez disso. Uma única coleta de lixo pode ser compactada para uma geração e não compactada para outra. Para uma coleta de lixo em qualquer geração específica, o criador de perfil receberá um retorno de chamada de SurvivingReferences2 ou de MovedReferences2, mas não de ambos.

Vários retornos de chamada de SurvivingReferences2 podem ser recebidos durante uma coleta de lixo específica, devido a buffers internos limitados, vários retornos de chamada durante a coleta de lixo de servidor e outros motivos. No caso de vários retornos de chamada durante uma coleta de lixo, as informações são cumulativas. Todas as referências relatadas em qualquer retorno de chamada de SurvivingReferences2 sobrevivem à coleta de lixo.

Se o criador de perfil implementar as interfaces ICorProfilerCallback e ICorProfilerCallback4, o método SurvivingReferences2 será chamado antes do método ICorProfilerCallback2::SurvivingReferences, mas somente se SurvivingReferences2 retornar com êxito. Os profilers podem retornar um HRESULT que indica falha do método SurvivingReferences2, para evitar chamar o segundo método.

Requisitos

Plataformas: confira Requisitos do sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

Versões do .NET Framework: disponíveis desde 4.5

Confira também