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