Condividi tramite


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

Altre risorse

Interfacce di profilatura

Profilatura (riferimenti alle API non gestite)