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