Compartilhar via


Método ICorProfilerCallback4::MovedReferences2

Chamado para relatar o novo layout de objetos no heap como resultado de uma coleta de lixo de compactação. Esse método será chamado se o criador de perfil tiver implementado a interface ICorProfilerCallback4 . Esse retorno de chamada substitui o método ICorProfilerCallback::MovedReferences , pois pode relatar intervalos maiores de objetos cujos comprimentos excedem o que pode ser expresso em um ULONG.

Sintaxe

HRESULT MovedReferences2(
    [in]  ULONG  cMovedObjectIDRanges,
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] SIZE_T    cObjectIDRangeLength[] );

Parâmetros

cMovedObjectIDRanges [in] O número de blocos de objetos contíguos que se moveram como resultado da compactação da coleta de lixo. Ou seja, o valor é cMovedObjectIDRanges o tamanho total de oldObjectIDRangeStartmatrizes e cObjectIDRangeLength matrizesnewObjectIDRangeStart.

Os próximos três argumentos são MovedReferences2 matrizes paralelas. Em outras palavras, oldObjectIDRangeStart[i]e newObjectIDRangeStart[i]cObjectIDRangeLength[i] todos dizem respeito a um único bloco de objetos contíguos.

oldObjectIDRangeStart [in] Uma matriz de ObjectID valores, cada um deles é o endereço inicial antigo (pré-coleta de lixo) de um bloco de objetos dinâmicos contíguos na memória.

newObjectIDRangeStart [in] Uma matriz de ObjectID valores, cada um deles é o novo endereço inicial (pós-coleta de lixo) de um bloco de objetos dinâmicos contíguos na memória.

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

Um tamanho é especificado para cada bloco referenciado nas matrizes e newObjectIDRangeStart nas oldObjectIDRangeStart matrizes.

Observações

Um coletor de lixo compactador recupera a memória ocupada por objetos mortos e compactações que liberaram espaço. Como resultado, os objetos dinâmicos podem ser movidos dentro do heap e ObjectID os valores distribuídos por notificações anteriores podem ser alterados.

Suponha que um valor existente ObjectID (oldObjectID) esteja dentro do seguinte intervalo:

oldObjectIDRangeStart[i] <= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

Nesse caso, o deslocamento do início do intervalo até o início do objeto é o seguinte:

oldObjectID - oldObjectRangeStart[i]

Para qualquer valor desse i valor está no seguinte intervalo:

0 <= i<cMovedObjectIDRanges

você pode calcular o novo ObjectID da seguinte maneira:

newObjectID = newObjectIDRangeStart[i] + (oldObjectID - oldObjectIDRangeStart[i])

Nenhum dos ObjectID valores passados é MovedReferences2 válido durante o retorno de chamada em si, pois o coletor de lixo pode estar no meio da movimentação de objetos de locais antigos para novos locais. Portanto, os criadores de perfil não devem tentar inspecionar objetos durante uma MovedReferences2 chamada. Um retorno de chamada ICorProfilerCallback2::GarbageCollectionFinished indica que todos os objetos foram movidos para seus novos locais e a inspeção pode ser executada.

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

Requirements

Plataformas: confira Requisitos do sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

Versões do .NET Framework: Disponível desde 4.5

Consulte também