Metodo ICorProfilerCallback::MovedReferences
Chiamato per segnalare il nuovo layout degli oggetti nell'heap a seguito di una Garbage Collection di compattazione.
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
Parametri
cMovedObjectIDRanges
[in] Numero di blocchi di oggetti contigui che si sono spostati a seguito della Garbage Collection di compattazione. In altri termini, il valore del parametro cMovedObjectIDRanges è la dimensione totale delle matrici oldObjectIDRangeStart, newObjectIDRangeStart e cObjectIDRangeLength.I successivi tre argomenti di MovedReferences sono matrici parallele. In altri termini, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] e cObjectIDRangeLength[i] riguardano tutte un solo blocco di oggetti contigui.
oldObjectIDRangeStart
[in] Matrice di valori ObjectID, ognuno dei quali è il vecchio indirizzo iniziale (precedente alla Garbage Collection) di un blocco di oggetti attivi contigui in memoria.newObjectIDRangeStart
[in] Matrice di valori ObjectID, ognuno dei quali è il nuovo indirizzo iniziale (successivo alla Garbage Collection) di un blocco di oggetti attivi contigui in memoria.cObjectIDRangeLength
[in] Matrice di interi, ognuno dei quali è la dimensione di un blocco di oggetti contigui in memoria.È specificata una dimensione per ogni blocco a cui viene fatto riferimento nelle matrici oldObjectIDRangeStart e newObjectIDRangeStart.
Note
Un Garbage Collector di compattazione recupera la memoria occupata dagli oggetti inutilizzati e compatta lo spazio liberato. Gli oggetti attivi possono quindi essere spostati all'interno dell'heap e i valori di ObjectID distribuiti dalle notifiche precedenti possono cambiare.
Si supponga che il valore di un ObjectID esistente (oldObjectID) si trovi all'interno dell'intervallo seguente:
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
In questo caso, l'offset dall'inizio dell'intervallo all'inizio dell'oggetto è il seguente:
oldObjectID - oldObjectRangeStart[i]
Per qualsiasi valore di i all'interno dell'intervallo seguente:
0 <= i < cMovedObjectIDRanges
è possibile calcolare il nuovo ObjectID nel modo seguente:
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
Nessuno dei valori di ObjectID passati da MovedReferences è valido durante il callback vero e proprio, in quanto il Garbage Collection potrebbe non avere ancora finito di spostare gli oggetti dalle vecchie posizioni a quelle nuove. I profiler non devono pertanto tentare di controllare gli oggetti durante una chiamata di MovedReferences. Il callback di ICorProfilerCallback2::GarbageCollectionFinished indica che tutti gli oggetti sono stati spostati nelle nuove posizioni e che è possibile eseguire l'ispezione.
Per ulteriori informazioni sulla modalità in cui l'API di analisi registra valori di ObjectID, vedere Rilevamento degli oggetti nell'API di profilatura.
Requisiti
Piattaforme: vedere Requisiti di sistema di .NET Framework.
Intestazione: CorProf.idl, CorProf.h
Libreria: CorGuids.lib
Versioni di .NET Framework: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0
Vedere anche
Riferimenti
Interfaccia ICorProfilerCallback