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]
+ (oldObjectID
– oldObjectIDRangeStart[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