ICorProfilerCallback::MovedReferences (Método)
Se le llama para informar de la nueva disposición de los objetos en la pila como resultado de compactar una recolección de elementos no utilizados.
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 desplazaron como resultado de compactar la recolección de elementos no utilizados. Es decir, el valor de cMovedObjectIDRanges es el tamaño total de las matrices de oldObjectIDRangeStart, newObjectIDRangeStart y cObjectIDRangeLength.Los tres argumentos siguientes de MovedReferences son matrices paralelas. Es decir, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] y cObjectIDRangeLength[i] se refieren a un bloque único de objetos contiguos.
oldObjectIDRangeStart
[in] Matriz de valores ObjectID, cada uno de los cuales es la dirección inicial anterior (colección de pre-recolección) de un bloque de objetos contiguos, activos en memoria.newObjectIDRangeStart
[in] Matriz de valores ObjectID, cada uno de los cuales es la dirección inicial nueva (colección de post-recolección) de un bloque de objetos contiguos, activos 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 matrices oldObjectIDRangeStart y newObjectIDRangeStart.
Comentarios
Un recolector de elementos no utilizados que compacta reclama la memoria ocupada por objetos inactivos y compacta ese espacio liberado. Como resultado, los objetos activos se podrían desplazar dentro del montón y los valores de ObjectID distribuidos por notificaciones anteriores podrían cambiar.
Suponga que un valor de ObjectID existente (oldObjectID) está en el siguiente intervalo:
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
En este caso, el desplazamiento desde el inicio del intervalo al inicio del objeto es como sigue:
oldObjectID - oldObjectRangeStart[i]
Para cualquier valor de i que está en el intervalo siguiente:
0 <= i < cMovedObjectIDRanges
puede calcular el nuevo valor de ObjectID como sigue:
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
Ninguno de los valores ObjectID pasados por MovedReferences es válido durante la devolución de llamada, porque la recolección de elementos no utilizados podría estar moviendo objetos de las ubicaciones antiguas a las ubicaciones nuevas. Por consiguiente, los generadores de perfiles no deberían intentar inspeccionar objetos durante una llamada a MovedReferences. Una devolución de llamada de ICorProfilerCallback2::GarbageCollectionFinished indica que todos los objetos han sido movidos a su nueva ubicación y se pueden realizar las inspecciones.
Para obtener más información sobre cómo la API de generación de perfiles realiza el seguimiento de los valores de ObjectID, vea Seguimiento de objetos en la API de generación de perfiles.
Requisitos
Plataformas: vea Requisitos de sistema de .NET Framework.
Encabezado: CorProf.idl, CorProf.h
Biblioteca: CorGuids.lib
Versiones de .NET Framework: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0
Vea también
Referencia
ICorProfilerCallback (Interfaz)
Otros recursos
Interfaces para generación de perfiles
Generación de perfiles (Referencia de la API no administrada)