Compartir por


ICorProfilerCallback4::MovedReferences2 (Método)

Se llama para notificar el nuevo diseño de objetos en el montón como resultado de una recolección de elementos no utilizados compactada. Se llama a este método si el generador de perfiles ha implementado la interfaz ICorProfilerCallback4 . Esta devolución de llamada reemplaza al método ICorProfilerCallback::MovedReferences , ya que puede notificar intervalos de objetos mayores cuyas longitudes superen lo que se puede expresar en un ULONG.

Syntax

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 de compactación. Es decir, el valor de cMovedObjectIDRanges es el tamaño total de las oldObjectIDRangeStartmatrices , newObjectIDRangeStarty cObjectIDRangeLength .

Los tres argumentos siguientes de MovedReferences2 son matrices paralelas. En otras palabras, oldObjectIDRangeStart[i], newObjectIDRangeStart[i]y cObjectIDRangeLength[i] todos se refieren a un único bloque de objetos contiguos.

oldObjectIDRangeStart [in] Matriz de ObjectID valores, cada uno de los cuales es la dirección inicial anterior (recolección previa a elementos no utilizados) de un bloque de objetos dinámicos contiguos en memoria.

newObjectIDRangeStart [in] Matriz de ObjectID valores, cada una de las cuales es la nueva dirección inicial (posterior a la recolección de elementos no utilizados) de un bloque de objetos dinámicos contiguos en memoria.

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

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

Observaciones

Un recolector de elementos no utilizados compacta recupera la memoria ocupada por objetos muertos y compacta ese espacio libre. Como resultado, los objetos dinámicos se pueden mover dentro del montón y ObjectID los valores distribuidos por las notificaciones anteriores podrían cambiar.

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

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

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

oldObjectID - oldObjectRangeStart[i]

Para cualquier valor de i que se encuentra en el intervalo siguiente:

0 <= i<cMovedObjectIDRanges

Puede calcular el nuevo ObjectID de la siguiente manera:

newObjectID = newObjectIDRangeStart[i] + (oldObjectID - oldObjectIDRangeStart[i])

Ninguno de los ObjectID valores pasados por MovedReferences2 son válidos durante la propia devolución de llamada, ya que el recolector de elementos no utilizados podría estar en medio de mover objetos de ubicaciones antiguas a nuevas ubicaciones. Por lo tanto, los generadores de perfiles no deben intentar inspeccionar objetos durante una MovedReferences2 llamada. Una devolución de llamada ICorProfilerCallback2::GarbageCollectionFinished indica que todos los objetos se han movido a sus nuevas ubicaciones y se puede realizar la inspección.

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

Requisitos

Plataformas: Consulte Requisitos del sistema.

Encabezado: CorProf.idl, CorProf.h

Biblioteca: CorGuids.lib

Versiones de .NET Framework: Disponible desde la versión 4.5

Consulte también