Partager via


ICorProfilerCallback::MovedReferences, méthode

Appelé pour signaler la nouvelle disposition des objets dans le tas suite à un garbage collection de compactage.

HRESULT MovedReferences(
    [in]  ULONG  cMovedObjectIDRanges,
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
    [in, size_is(cMovedObjectIDRanges)] ULONG    cObjectIDRangeLength[] );

Paramètres

  • cMovedObjectIDRanges
    [in] Nombre de blocs d'objets contigus qui ont été déplacés suite au garbage collection de compactage. Autrement dit, la valeur de cMovedObjectIDRanges correspond à la taille totale des tableaux oldObjectIDRangeStart, newObjectIDRangeStartet cObjectIDRangeLength.

    Les trois arguments suivants de MovedReferences sont des tableaux parallèles. En d'autres termes, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] et cObjectIDRangeLength[i] concernent un seul bloc d'objets contigus.

  • oldObjectIDRangeStart
    [in] Tableau de valeurs ObjectID, qui correspondent chacune à l'ancienne adresse de départ (avant le garbage collection) d'un bloc d'objets actifs contigus en mémoire.

  • newObjectIDRangeStart
    [in] Tableau de valeurs ObjectID, qui correspondent chacune à la nouvelle adresse de départ (après le garbage collection) d'un bloc d'objets actifs contigus en mémoire.

  • cObjectIDRangeLength
    [in] Tableau d'entiers, qui correspondent chacun à la taille d'un bloc d'objets contigus en mémoire.

    Une taille est spécifiée pour chaque bloc référencé dans les tableaux oldObjectIDRangeStart et newObjectIDRangeStart.

Notes

Un garbage collector de compactage libère la mémoire occupée par des objets inactifs et compacte cet espace libéré. Par conséquent, les objets actifs peuvent être déplacés dans le tas, et les valeurs ObjectID distribuées par des notifications précédentes peuvent donc changer.

Supposez qu'une valeur ObjectID existante (oldObjectID) se trouve dans la plage suivante :

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

L'offset du début de la plage jusqu'au début de l'objet est, dans ce cas, le suivant :

oldObjectID - oldObjectRangeStart[i]

Pour toute valeur d'i qui se trouve dans la plage suivante :

0 <= i < cMovedObjectIDRanges

vous pouvez calculer le nouvel ObjectID de la manière suivante :

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

Aucune des valeurs ObjectID passées par MovedReferences n'est valide pendant le rappel lui-même, le garbage collection pouvant être en train de déplacer des objets des anciens emplacements vers les nouveaux. Par conséquent, les profileurs ne doivent pas essayer d'inspecter les objets pendant un appel MovedReferences. Un rappel ICorProfilerCallback2::GarbageCollectionFinished indique que tous les objets ont été déplacés vers leurs nouveaux emplacements et qu'une inspection peut être effectuée.

Pour plus d'informations sur la façon dont l'API de profilage suit des valeurs ObjectID, consultez Suivi d'objet dans l'API de profilage.

Configuration requise

Plateformes : consultez Configuration requise du .NET Framework.

En-tête : CorProf.idl, CorProf.h

Bibliothèque : CorGuids.lib

Versions du .NET Framework : 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0

Voir aussi

Référence

ICorProfilerCallback, interface

Autres ressources

Interfaces de profilage

Profilage (Référence des API non managées)