Share via


Método ICorProfilerCallback::MovedReferences

Chamada para comunicar o novo esquema de objetos na área dinâmica para dados como resultado da compactação da libertação da memória.

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 que foram movidos como resultado da compactação da libertação da memória. Ou seja, o valor de cMovedObjectIDRanges é o tamanho total das oldObjectIDRangeStartmatrizes , newObjectIDRangeStarte cObjectIDRangeLength .

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

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

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

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

É especificado um tamanho para cada bloco referenciado nas oldObjectIDRangeStart matrizes e newObjectIDRangeStart .

Observações

Importante

Este método comunica tamanhos como MAX_ULONG para objetos que são superiores a 4 GB em plataformas de 64 bits. Para obter o tamanho dos objetos com mais de 4 GB, utilize o método ICorProfilerCallback4::MovedReferences2 .

Um recoletor de lixo compactador recupera a memória ocupada por objetos inativos e compactos que libertaram espaço. Como resultado, os objetos dinâmicos podem ser movidos dentro da área dinâmica e ObjectID os valores distribuídos por notificações anteriores podem mudar.

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

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

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

oldObjectID - oldObjectRangeStart[i]

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

0 <= i<cMovedObjectIDRanges

pode calcular o novo ObjectID da seguinte forma:

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

Nenhum dos ObjectID valores transmitidos é MovedReferences válido durante a chamada de retorno propriamente dita, porque a libertação da memória pode estar no meio da movimentação de objetos de localizações antigas para novas localizações. Por conseguinte, os geradores de perfis não devem tentar inspecionar objetos durante uma MovedReferences chamada. Uma chamada de retorno ICorProfilerCallback2::GarbageCollectionFinished indica que todos os objetos foram movidos para as novas localizações e que a inspeção pode ser efetuada.

Requisitos

Plataformas: Veja Requisitos de Sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

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

Ver também