Compartilhar via


Método ICorProfilerCallback::MovedReferences

Chamado para relatar o novo layout de objetos no heap como resultado de uma coleta de lixo compactada.

Sintaxe

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

Parâmetros

cMovedObjectIDRanges
[in] O número de blocos de objetos contíguos movidos como resultado da coleta de lixo compactada. Ou seja, o valor de cMovedObjectIDRanges é o tamanho total de matrizes oldObjectIDRangeStart, newObjectIDRangeStart e cObjectIDRangeLength.

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

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

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

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

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

Comentários

Importante

Esse método relata tamanhos como MAX_ULONG para objetos maiores que 4 GB em plataformas de 64 bits. Para obter o tamanho de objetos maiores que 4 GB, use o método ICorProfilerCallback4::MovedReferences2.

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

Suponha que um valor de 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 de i que esteja no seguinte intervalo:

0 <= i<cMovedObjectIDRanges

você pode calcular o novo ObjectID da seguinte maneira:

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

Nenhum dos valores de ObjectID passados por MovedReferences é válido durante o próprio retorno de chamada, porque a coleta de lixo pode estar no processo de mover objetos de locais antigos para novos. Portanto, os criadores de perfis não devem tentar inspecionar objetos durante uma chamada MovedReferences. Um retorno de chamada ICorProfilerCallback2::GarbageCollectionFinished indica que todos os objetos foram movidos para seus novos locais e a inspeção pode ser executada.

Requisitos

Plataformas: confira Requisitos do sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

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

Confira também