Partager via


ICorProfilerCallback::MovedReferences, méthode

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

Syntaxe

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 à la suite du garbage collection de compactage. Autrement dit, la valeur de cMovedObjectIDRanges est la taille totale des tableaux oldObjectIDRangeStart, newObjectIDRangeStart et 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 bloc unique d'objets contigus.

oldObjectIDRangeStart
[in] Tableau de valeurs ObjectID, chacune d'elles étant l'ancienne adresse de début (avant le garbage collection) d'un bloc d'objets actifs contigus dans la mémoire.

newObjectIDRangeStart
[in] Tableau de valeurs ObjectID, chacune d’elles étant la nouvelle adresse de début (après le garbage collection) d’un bloc d’objets actifs contigus dans la mémoire.

cObjectIDRangeLength
[in] Tableau d'entiers, chacun d'eux correspondant à la taille d'un bloc d'objets contigus dans la mémoire.

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

Notes

Important

Cette méthode signale les tailles en tant que MAX_ULONG pour les objets qui sont supérieurs à 4 Go sur les plateformes 64 bits. Pour obtenir la taille des objets supérieurs à 4 Go, utilisez la méthode ICorProfilerCallback4::MovedReferences2 à la place.

Un garbage collection de compactage récupère la mémoire occupée par des objets morts 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 changer.

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

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

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

oldObjectID - oldObjectRangeStart[i]

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

0 <= i<cMovedObjectIDRanges

Vous pouvez calculer le nouvel ObjectID comme suit :

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

Aucune des valeurs ObjectID passées par MovedReferences n'est valide pendant le rappel lui-même, car le garbage collector peut être occupé à déplacer des objets depuis des anciens emplacements vers des nouveaux. Les profileurs ne doivent donc pas essayer d'inspecter des objets pendant un appel de MovedReferences. Un rappel ICorProfilerCallback2::GarbageCollectionFinished indique que tous les objets ont été déplacés vers leurs nouveaux emplacements et que l’inspection peut être effectuée.

Spécifications

Plateformes : Consultez Configuration requise.

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

Bibliothèque : CorGuids.lib

Versions de .NET Framework : Disponible depuis la version 2.0

Voir aussi