ICorProfilerCallback4::MovedReferences2, méthode

Appelée pour signaler la nouvelle disposition d'objets dans le tas suite à un garbage collection de compactage. Cette méthode est appelée si le profileur a implémenté l'interface ICorProfilerCallback4. Ce rappel remplace la méthode ICorProfilerCallback::MovedReferences, car il peut indiquer des plages plus larges d'objets dont les longueurs dépassent ce qui peut être exprimé dans un ULONG.

Syntaxe

HRESULT MovedReferences2(  
    [in]  ULONG  cMovedObjectIDRanges,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] SIZE_T    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 MovedReferences2 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

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 MovedReferences2 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 MovedReferences2. 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.

Si le profileur implémente à la fois les interfaces ICorProfilerCallback et ICorProfilerCallback4, la méthode MovedReferences2 est appelée avant la méthode ICorProfilerCallback::MovedReferences, mais uniquement si la méthode MovedReferences2 est correctement retournée. Les profileurs peuvent retourner un HRESULT qui indique un échec de la méthode MovedReferences2 pour éviter d'appeler la seconde méthode.

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 4.5

Voir aussi