Método ICorProfilerCallback4::MovedReferences2
Chamado para comunicar o novo esquema de objetos na área dinâmica como resultado de uma compactação da libertação da memória. Este método é chamado se o profiler tiver implementado a interface ICorProfilerCallback4 . Esta chamada de retorno substitui o método ICorProfilerCallback::MovedReferences , porque pode comunicar 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
[in] O número de blocos de objetos contíguos que se movem 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 MovedReferences2
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) 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) de um bloco de objetos dinâmicos contíguos na memória.
cObjectIDRangeLength
[in] Uma matriz de números inteiros, cada um dos quais é do 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
Um recoletor de lixo compactador recupera a memória ocupada por objetos mortos 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 ser alterados.
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 que i
esteja no intervalo seguinte:
0 <= i
<cMovedObjectIDRanges
pode calcular o novo ObjectID
da seguinte forma:
newObjectID
= newObjectIDRangeStart[i]
+ (oldObjectID
– oldObjectIDRangeStart[i]
)
Nenhum dos ObjectID
valores transmitidos é MovedReferences2
válido durante a chamada de retorno propriamente dita, uma vez que o recoletor de lixo pode estar no meio da movimentação de objetos de localizações antigas para novas localizações. Por conseguinte, os perfis não devem tentar inspecionar objetos durante uma MovedReferences2
chamada. Uma chamada de retorno ICorProfilerCallback2::GarbageCollectionFinished indica que todos os objetos foram movidos para as novas localizações e a inspeção pode ser efetuada.
Se o profiler implementar as interfaces ICorProfilerCallback e ICorProfilerCallback4 , o MovedReferences2
método é chamado antes do método ICorProfilerCallback::MovedReferences , mas apenas se o MovedReferences2
método devolver com êxito. Os profilers podem devolver um HRESULT que indica a falha do MovedReferences2
método, para evitar chamar o segundo método.
Requisitos
Plataformas: Veja Requisitos do Sistema.
Cabeçalho: CorProf.idl, CorProf.h
Biblioteca: CorGuids.lib
.NET Framework Versões: Disponível desde 4.5