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] + (oldObjectIDoldObjectIDRangeStart[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

Vedi anche