Comparteix a través de


ICorProfilerCallback4::MovedReferences2 (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. Se llama a este método si se implementa la interfaz ICorProfilerCallback4 en el generador de perfiles. Esta devolución de llamada reemplaza el método ICorProfilerCallback2::MovedReferences porque puede notificar intervalos más grandes de objetos cuyas longitudes superen lo que se puede expresar en un ULONG.

Sintaxis

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] 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 MovedReferences2 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

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 MovedReferences2 son válidos durante la devolución de llamada en sí porque el recolector de elementos no utilizados puede estar en pleno proceso de mover objetos desde ubicaciones anteriores a ubicaciones nuevas. Por lo tanto, los generadores de perfiles no deben intentar inspeccionar objetos durante una llamada a MovedReferences2. 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.

Si el generador de perfiles implementa las interfaces ICorProfilerCallback y ICorProfilerCallback4, se llama al método MovedReferences2 antes que al método ICorProfilerCallback::MovedReferences, pero solo si el método MovedReferences2 vuelve correctamente. Los generadores de perfiles pueden devolver un HRESULT que indica un error del método MovedReferences2 para evitar llamar al segundo método.

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 4.5

Consulte también