Share via


Metodo ICorProfilerCallback4::MovedReferences2

Chiamato per segnalare il nuovo layout degli oggetti nell'heap a seguito di un'operazione di Garbage Collection con compattazione. Questo metodo viene chiamato se il profiler ha implementato l'interfaccia ICorProfilerCallback4 . Questo callback sostituisce il metodo ICorProfilerCallback::MovedReferences , perché può segnalare intervalli più grandi di oggetti le cui lunghezze superano ciò che può essere espresso in una ULONG.

Sintassi

HRESULT MovedReferences2(  
    [in]  ULONG  cMovedObjectIDRanges,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] SIZE_T    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 MovedReferences2 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

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 MovedReferences2 è valido durante il callback vero e proprio, perché è possibile che il Garbage Collector 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 MovedReferences2. Un callback ICorProfilerCallback2::GarbageCollectionFinished indica che tutti gli oggetti sono stati spostati nelle nuove posizioni e l'ispezione possono essere eseguiti.

Se il profiler implementa sia il metodo ICorProfilerCallback che le interfacce ICorProfilerCallback4 , il MovedReferences2 metodo viene chiamato prima del metodo ICorProfilerCallback::MovedReferences , ma solo se il MovedReferences2 metodo restituisce correttamente. I profiler possono restituire un valore HRESULT indicante un errore nel metodo MovedReferences2 per evitare di chiamare il secondo metodo.

Requisiti

Piattaforme: vedere Requisiti di sistema di .NET Framework.

Intestazione: CorProf.idl, CorProf.h

Libreria: CorGuids.lib

Versioni di .NET Framework: Disponibile dalla versione 4.5

Vedi anche