Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Appelé pour signaler la nouvelle disposition d’objets dans le tas à la suite d’un garbage collection compacting. 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 signaler de plus grandes plages 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 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 MovedReferences2 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
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 MovedReferences2 n’est valide pendant le rappel lui-même, car le garbage collector 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 MovedReferences2 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.
Si le profileur implémente les interfaces ICorProfilerCallback et ICorProfilerCallback4 , la MovedReferences2 méthode est appelée avant la méthode ICorProfilerCallback ::MovedReferences , mais uniquement si la MovedReferences2 méthode retourne correctement. Les profils peuvent retourner un HRESULT qui indique l’échec de la MovedReferences2 méthode, pour éviter d’appeler la deuxième méthode.
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 4.5