Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Chamado para relatar o novo layout de objetos no heap como resultado de uma coleta de lixo de compactação.
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 se moveram como resultado da compactação da coleta de lixo. Ou seja, o valor é cMovedObjectIDRanges o tamanho total de oldObjectIDRangeStartmatrizes e cObjectIDRangeLength matrizesnewObjectIDRangeStart.
Os próximos três argumentos são MovedReferences matrizes paralelas. Em outras palavras, oldObjectIDRangeStart[i]e newObjectIDRangeStart[i]cObjectIDRangeLength[i] todos dizem respeito a um único bloco de objetos contíguos.
oldObjectIDRangeStart [in] Uma matriz de ObjectID valores, cada um deles é o endereço inicial antigo (pré-coleta de lixo) de um bloco de objetos dinâmicos contíguos na memória.
newObjectIDRangeStart [in] Uma matriz de ObjectID valores, cada um deles é o novo endereço inicial (pós-coleta de lixo) de um bloco de objetos dinâmicos contíguos na memória.
cObjectIDRangeLength [in] Uma matriz de inteiros, cada um deles é do tamanho de um bloco de objetos contíguos na memória.
Um tamanho é especificado para cada bloco referenciado nas matrizes e newObjectIDRangeStart nas oldObjectIDRangeStart matrizes.
Observações
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 compactador recupera a memória ocupada por objetos mortos e compactações que liberaram espaço. Como resultado, os objetos dinâmicos podem ser movidos dentro do heap e ObjectID os valores distribuídos por notificações anteriores podem ser alterados.
Suponha que um valor existente 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 desse i valor está no seguinte intervalo:
0 <= i<cMovedObjectIDRanges
você pode calcular o novo ObjectID da seguinte maneira:
newObjectID
=
newObjectIDRangeStart[i] + (oldObjectID - oldObjectIDRangeStart[i])
Nenhum dos ObjectID valores passados é MovedReferences válido durante o retorno de chamada em si, pois a coleta de lixo pode estar no meio da movimentação de objetos de locais antigos para novos locais. Portanto, os criadores de perfil não devem tentar inspecionar objetos durante uma MovedReferences chamada. Um retorno de chamada ICorProfilerCallback2::GarbageCollectionFinished indica que todos os objetos foram movidos para seus novos locais e a inspeção pode ser executada.
Requirements
Plataformas: confira Requisitos do sistema.
Cabeçalho: CorProf.idl, CorProf.h
Biblioteca: CorGuids.lib
Versões do .NET Framework: Disponível desde 2.0