Método de ICorProfilerCallback::MovedReferences
Chamado para informar o novo layout de objetos na heap como resultado de uma coleta de lixo de compactação.
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 contíguos objetos que movidos como resultado de coleta de lixo a compactação. Ou seja, o valor de cMovedObjectIDRanges é o tamanho total da oldObjectIDRangeStart, newObjectIDRangeStart, e cObjectIDRangeLength arrays.Os próximos três argumentos de MovedReferences são matrizes em paralelo. Em outras palavras, oldObjectIDRangeStart[i], newObjectIDRangeStart[i], e cObjectIDRangeLength[i] todos os preocupação de um único bloco contíguo de objetos.
oldObjectIDRangeStart
[in] Uma matriz de ObjectID valores, cada um deles é o antigo (coleção pre-garbage) o endereço de um bloco de contíguo, inicial live objetos na memória.newObjectIDRangeStart
[in] Uma matriz de ObjectID valores, cada um deles é nova (post-garbage coleção) Iniciando o endereço de um bloco contíguo, ao vivo de objetos na memória.cObjectIDRangeLength
[in] Uma matriz de inteiros, cada um deles é o tamanho de um bloco contíguo objetos na memória.Um tamanho especificado para cada bloco mencionada no oldObjectIDRangeStart e newObjectIDRangeStart arrays.
Comentários
Um coletor de lixo compactando recupera a memória ocupada por objetos inativos e compacta liberado espaço. Como resultado, os objetos ao vivo podem ser movidos dentro do heap, e ObjectID valores distribuídos por notificações anteriores podem alterar.
Suponha que uma existente ObjectID valor (oldObjectID) encontra-se no intervalo a seguir:
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
Nesse caso, o offset do início do intervalo para o início do objeto é o seguinte:
oldObjectID - oldObjectRangeStart[i]
Para qualquer valor de i que está no seguinte intervalo:
0 <= i < cMovedObjectIDRanges
Você pode calcular a nova ObjectID da seguinte maneira:
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
Nenhum da ObjectID valores passados MovedReferences são válidos durante o retorno de chamada, porque a coleta de lixo pode estar no meio da movimentação de objetos de locais antigos para novos locais. Portanto, geradores de perfis não devem tentar inspecionar objetos durante um MovedReferences chamada. A ICorProfilerCallback2::GarbageCollectionFinished chamada de retorno indica que todos os objetos que tenham sido movidos para suas novas localizações e inspeção pode ser executada.
Para obter mais informações sobre como a API de criação de perfil controla ObjectID valores, consulte A API de criação de perfil de rastreamento de objeto.
Requisitos
Plataformas: Consulte Requisitos de sistema do .NET Framework.
Cabeçalho: Corprof. idl, CorProf.h
Biblioteca: CorGuids.lib
.NET Framework versões: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0
Consulte também
Referência
Interface de ICorProfilerCallback