Comparteix a través de


ICorProfilerCallback::MovedReferences (Método)

Se le llama para informar de la nueva distribución de los objetos del montón como resultado de una recolección de elementos no utilizados con compactación.

Sintaxis

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] Número de bloques de objetos contiguos que se movieron como resultado de la recolección de elementos no utilizados con compactación. Es decir, el valor de cMovedObjectIDRanges es el tamaño total de las matrices oldObjectIDRangeStart, newObjectIDRangeStart y cObjectIDRangeLength.

Los tres argumentos siguientes de MovedReferences son matrices paralelas. En otras palabras, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] y cObjectIDRangeLength[i] hacen referencia a un único bloque de objetos contiguos.

oldObjectIDRangeStart
[in] Matriz de valores ObjectID, cada uno de los cuales es la dirección inicial antigua (antes de la recolección de elementos no utilizados) de un bloque de objetos contiguos activos en la memoria.

newObjectIDRangeStart
[in] Matriz de valores ObjectID, cada uno de los cuales es la dirección inicial nueva (después de la recolección de elementos no utilizados) de un bloque de objetos contiguos activos en la memoria.

cObjectIDRangeLength
[in] Matriz de enteros, cada uno de los cuales es el tamaño de un bloque de objetos contiguos en la memoria.

Se especifica un tamaño para cada bloque al que se hace referencia en las matrices oldObjectIDRangeStart y newObjectIDRangeStart.

Comentarios

Importante

Este método notifica tamaños como MAX_ULONG para objetos de más de 4 GB en plataformas de 64 bits. Para obtener el tamaño de los objetos que sean mayores de 4 GB, use el método ICorProfilerCallback4::Movedreferences2.

Un recolector de elementos no utilizados con compactación recupera la memoria ocupada por los objetos inactivos y compacta ese espacio liberado. Como resultado, los objetos activos podrían moverse dentro del montón y los valores de ObjectID distribuidos por notificaciones anteriores podrían cambiar.

Supongamos que un valor ObjectID existente (oldObjectID) se encuentra dentro del intervalo siguiente:

oldObjectIDRangeStart[i]<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

En este caso, el desplazamiento desde el inicio del intervalo al inicio del objeto es el siguiente:

oldObjectID - oldObjectRangeStart[i]

Para cualquier valor de i que esté en el intervalo siguiente:

0 <= i<cMovedObjectIDRanges

puede calcular el nuevo ObjectID de la siguiente manera:

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

Ninguno de los valores ObjectID pasados por MovedReferences son válidos durante la devolución de llamada en sí porque el recolector de elementos no utilizados puede estar en proceso de mover objetos de ubicaciones anteriores a nuevas. Por lo tanto, los generadores de perfiles no deben intentar inspeccionar objetos durante una llamada a MovedReferences. Si se produce una devolución de llamada al método ICorProfilerCallback2::GarbageCollectionFinished, significará que todos los objetos se movieron a sus nuevas ubicaciones y que se puede realizar la inspección.

Requisitos

Plataformas: Vea Requisitos de sistema.

Encabezado: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

Versiones de .NET Framework: disponible a partir de la versión 2.0

Consulte también