Metodo ICorProfilerCallback::MovedReferences
Chiamato per segnalare il nuovo layout degli oggetti nell'heap a seguito di un'operazione di Garbage Collection con compattazione.
Sintassi
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 spostati in seguito all'operazione di Garbage Collection con compattazione. Ciò significa che il valore di cMovedObjectIDRanges
corrisponde alle dimensioni totali delle matrici oldObjectIDRangeStart
, newObjectIDRangeStart
e cObjectIDRangeLength
.
I successivi tre argomenti di MovedReferences
sono matrici parallele. In altre parole, oldObjectIDRangeStart[i]
, newObjectIDRangeStart[i]
e cObjectIDRangeLength[i]
riguardano un singolo blocco di oggetti contigui.
oldObjectIDRangeStart
[in] Matrice di valori ObjectID
, ognuno dei quali è il vecchio indirizzo iniziale (precedente all'operazione di 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 all'operazione di Garbage Collection) di un blocco di oggetti attivi contigui in memoria.
cObjectIDRangeLength
[in] Matrice di Integer, ognuno dei quali corrisponde alle dimensioni di un blocco di oggetti contigui in memoria.
Viene specificata una dimensione per ogni blocco a cui viene fatto riferimento nelle matrici oldObjectIDRangeStart
e newObjectIDRangeStart
.
Commenti
Importante
Questo metodo segnala le dimensioni come MAX_ULONG
per gli oggetti maggiori di 4 GB su piattaforme a 64 bit. Per ottenere le dimensioni degli oggetti maggiori di 4 GB, usare invece il metodo ICorProfilerCallback4::MovedReferences2 .
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 un valore ObjectID
esistente (oldObjectID
) rientri nell'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
compreso nell'intervallo seguente:
0 <= i
<cMovedObjectIDRanges
è possibile calcolare il nuovo ObjectID
come segue:
newObjectID
= newObjectIDRangeStart[i]
+ (oldObjectID
– oldObjectIDRangeStart[i]
)
Nessuno dei valori di ObjectID
passati da MovedReferences
è valido durante il callback vero e proprio, perché è possibile che l'operazione di Garbage Collection stia ancora spostando gli oggetti dalle vecchie posizioni a quelle nuove. I profiler non devono quindi tentare di verificare gli oggetti durante una chiamata a MovedReferences
. Un callback ICorProfilerCallback2::GarbageCollectionFinished indica che è possibile eseguire lo spostamento di tutti gli oggetti nelle nuove posizioni e l'ispezione.
Requisiti
Piattaforme: vedere Requisiti di sistema di .NET Framework.
Intestazione: CorProf.idl, CorProf.h
Libreria: CorGuids.lib
Versioni di .NET Framework: Disponibile dalla versione 2.0