Partilhar via


Método ICorProfilerCallback::MovedReferences

Chamado para reportar a nova disposição dos objetos no heap como resultado de uma compactação de recolha de lixo.

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 [dentro] O número de blocos de objetos contíguos que se moveram como resultado da compactação da recolha de lixo. Ou seja, o valor de cMovedObjectIDRanges é o tamanho total dos oldObjectIDRangeStartarrays , newObjectIDRangeStart, e cObjectIDRangeLength .

Os três argumentos seguintes de MovedReferences são arrays paralelos. Por outras palavras, oldObjectIDRangeStart[i], newObjectIDRangeStart[i], e cObjectIDRangeLength[i] todos dizem respeito a um único bloco de objetos contíguos.

oldObjectIDRangeStart [dentro] Um array de ObjectID valores, cada um dos quais é o antigo endereço inicial (pré-recolha de lixo) de um bloco de objetos contíguos e vivos na memória.

newObjectIDRangeStart [dentro] Um array de ObjectID valores, cada um dos quais é o novo endereço inicial (pós-recolha de lixo) de um bloco de objetos contíguos e vivos na memória.

cObjectIDRangeLength [dentro] Um array de inteiros, cada um com o tamanho de um bloco de objetos contíguos na memória.

Um tamanho é especificado para cada bloco referenciado nos oldObjectIDRangeStart arrays e.newObjectIDRangeStart

Observações

Importante

Este método reporta tamanhos para MAX_ULONG objetos superiores a 4 GB em plataformas de 64 bits. Para obter o tamanho dos objetos superiores a 4 GB, use o método ICorProfilerCallback4::MovedReferences2 em vez disso.

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

Assuma que um valor existente ObjectID (oldObjectID) se encontra dentro do seguinte intervalo:

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

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

oldObjectID - oldObjectRangeStart[i]

Para qualquer valor de i que está no seguinte intervalo:

0 <= i<cMovedObjectIDRanges

Pode calcular o novo ObjectID da seguinte forma:

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

Nenhum dos ObjectID valores passados MovedReferences é válido durante o callback em si, porque a recolha de lixo pode estar a meio de mover objetos de locais antigos para novos. Por isso, os perfiladores não devem tentar inspecionar objetos durante uma MovedReferences chamada. Um callback ICorProfiler2::GarbageCollectionFinished indica que todos os objetos foram movidos para as suas novas localizações e que a inspeção pode ser realizada.

Requerimentos

Plataformas: Consulte Requisitos do sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

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

Consulte também