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 oldObjectIDRangeStart
matrizes , newObjectIDRangeStart
e 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]
+ (oldObjectID
– oldObjectIDRangeStart[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