Partilhar via


Método ICorProfilerCallback4::MovedReferences2

Chamado para comunicar o novo esquema de objetos na área dinâmica como resultado de uma compactação da libertação da memória. Este método é chamado se o profiler tiver implementado a interface ICorProfilerCallback4 . Esta chamada de retorno substitui o método ICorProfilerCallback::MovedReferences , porque pode comunicar intervalos maiores de objetos cujos comprimentos excedem o que pode ser expresso num 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 movem 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 MovedReferences2 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) 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) de um bloco de objetos dinâmicos contíguos na memória.

cObjectIDRangeLength
[in] Uma matriz de números inteiros, cada um dos quais é do 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

Um recoletor de lixo compactador recupera a memória ocupada por objetos mortos 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 ser alterados.

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 que i esteja no intervalo seguinte:

0 <= i<cMovedObjectIDRanges

pode calcular o novo ObjectID da seguinte forma:

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

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

Se o profiler implementar as interfaces ICorProfilerCallback e ICorProfilerCallback4 , o MovedReferences2 método é chamado antes do método ICorProfilerCallback::MovedReferences , mas apenas se o MovedReferences2 método devolver com êxito. Os profilers podem devolver um HRESULT que indica a falha do MovedReferences2 método, para evitar chamar o segundo método.

Requisitos

Plataformas: Veja Requisitos do Sistema.

Cabeçalho: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

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

Ver também