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