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]
+ (oldObjectID
– oldObjectIDRangeStart[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