Partager via


ICorProfilerCallback ::MovedReferences, méthode

Appelé pour signaler la nouvelle disposition d’objets dans le tas à la suite d’un garbage collection compacting.

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 déplacés à la suite du compactage du garbage collection. Autrement dit, la valeur est cMovedObjectIDRanges la taille totale des tableaux et cObjectIDRangeLength des newObjectIDRangeStartoldObjectIDRangeStarttableaux.

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

oldObjectIDRangeStart [in] Tableau de ObjectID valeurs, dont chacune est l’ancienne (pré-garbage collection) d’un bloc d’objets contigus en mémoire.

newObjectIDRangeStart [in] Tableau de ObjectID valeurs, dont chacune est la nouvelle adresse de départ (post-garbage collection) d’un bloc d’objets contigus et dynamiques en mémoire.

cObjectIDRangeLength [in] Tableau d’entiers, dont chacun est 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 et newObjectIDRangeStart les oldObjectIDRangeStart tableaux.

Remarques

Important

Cette méthode signale des tailles comme MAX_ULONG pour les objets supérieurs à 4 Go sur les plateformes 64 bits. Pour obtenir la taille des objets dont la taille est supérieure à 4 Go, utilisez plutôt la méthode ICorProfilerCallback4 ::MovedReferences2 .

Un récupérateur de mémoire compacté récupère la mémoire occupée par les objets morts et compacte qui libère de l’espace. Par conséquent, les objets en direct peuvent être déplacés dans le tas et ObjectID les valeurs distribuées par les notifications précédentes peuvent changer.

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

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

Dans ce cas, le décalage entre le début de la plage et le début de l’objet est le suivant :

oldObjectID - oldObjectRangeStart[i]

Pour toute valeur de i celle-ci se trouve dans la plage suivante :

0 <= i<cMovedObjectIDRanges

vous pouvez calculer le nouveau ObjectID comme suit :

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

Aucune des ObjectID valeurs passées par MovedReferences n’est valide pendant le rappel lui-même, car le garbage collection peut être au milieu du déplacement d’objets d’anciens emplacements vers de nouveaux emplacements. Par conséquent, les profileurs ne doivent pas tenter d’inspecter les objets pendant un MovedReferences appel. 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 du .NET Framework : Disponible depuis la version 2.0

Voir aussi