Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Chamado para reportar a nova disposição dos objetos no heap como resultado de uma compactação de recolha de lixo. Este método é chamado se o profiler implementou a interface ICorProfilerCallback4 . Este callback substitui o método ICorProfilerCallback::MovedReferences , porque pode reportar 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 [dentro] O número de blocos de objetos contíguos que se moveram como resultado da compactação da recolha de lixo. Ou seja, o valor de cMovedObjectIDRanges é o tamanho total dos oldObjectIDRangeStartarrays , newObjectIDRangeStart, e cObjectIDRangeLength .
Os três argumentos seguintes de MovedReferences2 são arrays paralelos. Por outras palavras, oldObjectIDRangeStart[i], newObjectIDRangeStart[i], e cObjectIDRangeLength[i] todos dizem respeito a um único bloco de objetos contíguos.
oldObjectIDRangeStart [dentro] Um array de ObjectID valores, cada um dos quais é o antigo endereço inicial (pré-recolha de lixo) de um bloco de objetos contíguos e vivos na memória.
newObjectIDRangeStart [dentro] Um array de ObjectID valores, cada um dos quais é o novo endereço inicial (pós-recolha de lixo) de um bloco de objetos contíguos e vivos na memória.
cObjectIDRangeLength [dentro] Um array de inteiros, cada um com o tamanho de um bloco de objetos contíguos na memória.
Um tamanho é especificado para cada bloco referenciado nos oldObjectIDRangeStart arrays e.newObjectIDRangeStart
Observações
Um coletor de lixo compactador recupera a memória ocupada por objetos mortos e compacta que libertou espaço. Como resultado, objetos vivos podem ser movidos dentro do heap, e ObjectID os valores distribuídos por notificações anteriores podem mudar.
Assuma que um valor existente ObjectID (oldObjectID) se encontra dentro do seguinte intervalo:
oldObjectIDRangeStart[i]
<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
Neste caso, o deslocamento do início do intervalo até ao início do objeto é o seguinte:
oldObjectID - oldObjectRangeStart[i]
Para qualquer valor de i que 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 passados MovedReferences2 é válido durante o callback em si, porque o coletor de lixo pode estar a meio de mover objetos de locais antigos para novos. Por isso, os perfiladores não devem tentar inspecionar objetos durante uma MovedReferences2 chamada. Um callback ICorProfiler2::GarbageCollectionFinished indica que todos os objetos foram movidos para as suas novas localizações e que a inspeção pode ser realizada.
Se o perfilador implementar tanto as interfaces ICorProfilerCallback como ICorProfilerCallback4 , o MovedReferences2 método é chamado antes do método ICorProfilerCallback::MovedReferences , mas apenas se o MovedReferences2 método for retornado com sucesso. Os perfiladores podem devolver um HRESULT que indique falha do MovedReferences2 método, para evitar chamar o segundo método.
Requerimentos
Plataformas: Consulte Requisitos do sistema.
Cabeçalho: CorProf.idl, CorProf.h
Biblioteca: CorGuids.lib
Versões do .NET Framework: Disponível desde 4.5