ICorProfilerCallback::MovedReferences-Methode

Wird aufgerufen, um das neue Layout von Objekten im Heap als Folge einer komprimierenden Garbage Collection zu melden.

Syntax

HRESULT MovedReferences(  
    [in]  ULONG  cMovedObjectIDRanges,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ULONG    cObjectIDRangeLength[] );  

Parameter

cMovedObjectIDRanges
[in] Die Anzahl der Blöcke zusammenhängender Objekte, die als Folge der komprimierenden Garbage Collection verschoben wurden. Das heißt, der Wert von cMovedObjectIDRanges entspricht der Gesamtgröße der Arrays oldObjectIDRangeStart, newObjectIDRangeStart und cObjectIDRangeLength.

Die nächsten drei Argumente von MovedReferences sind parallele Arrays. Mit anderen Worten, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] und cObjectIDRangeLength[i] betreffen alle einen einzelnen Block zusammenhängender Objekte.

oldObjectIDRangeStart
[in] Ein Array von ObjectID-Werten, von denen jeder die alte (vor der Garbage Collection vorhandene) Startadresse eines Blocks zusammenhängender aktiver Objekte im Arbeitsspeicher darstellt.

newObjectIDRangeStart
[in] Ein Array von ObjectID-Werten, von denen jeder die neue (nach der Garbage Collection vorhandene) Startadresse eines Blocks zusammenhängender aktiver Objekte im Arbeitsspeicher darstellt.

cObjectIDRangeLength
[in] Ein Array von Ganzzahlen, von denen jede die Größe eines Blocks zusammenhängender Objekte im Arbeitsspeicher darstellt.

Es wird eine Größe für jeden Block angegeben, auf den im oldObjectIDRangeStart-Array und im newObjectIDRangeStart-Array verwiesen wird.

Bemerkungen

Wichtig

Mit dieser Methode werden auf 64-Bit-Plattformen Größen für Objekte, die größer als 4 GB sind, als MAX_ULONG gemeldet. Verwenden Sie zum Abrufen der Größe von Objekten, die größer als 4 GB sind, stattdessen die ICorProfilerCallback4::MovedReferences2-Methode.

Ein komprimierender Garbage Collector gibt den von inaktiven Objekten belegten Arbeitsspeicher frei und komprimiert diesen freigegebenen Speicherplatz. Folglich könnten aktive Objekte innerhalb des Heaps verschoben werden, und ObjectID-Werte, die von vorherigen Benachrichtigungen verteilt wurden, könnten sich möglicherweise ändern.

Angenommen, ein vorhandener ObjectID-Wert (oldObjectID) liegt innerhalb des folgenden Bereichs:

oldObjectIDRangeStart[i]<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

In diesem Fall ist der Offset vom Anfang des Bereichs bis zum Anfang des Objekts wie folgt:

oldObjectID - oldObjectRangeStart[i]

Für jeden Wert von i, der im folgenden Bereich liegt:

0 <= i<cMovedObjectIDRanges

können Sie die neue ObjectID wie folgt berechnen:

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

Keiner der ObjectID-Werte, die von MovedReferences übergeben wurden, ist während des Rückrufs selbst gültig, weil die Garbage Collection zu diesem Zeitpunkt möglicherweise noch Objekte von alten Speicherorten an neue Speicherorte verschiebt. Deshalb sollten Profiler nicht versuchen, Objekte während eines MovedReferences-Aufrufs zu überprüfen. Ein ICorProfilerCallback2::GarbageCollectionFinished-Rückruf gibt an, dass alle Objekte an die neuen Speicherorte verschoben wurden und die Überprüfung ausgeführt werden kann.

Anforderungen

Plattformen: Informationen finden Sie unter Systemanforderungen.

Header: CorProf.idl, CorProf.h

Bibliothek: CorGuids.lib

.NET Framework-Versionen: Seit 2.0 verfügbar.

Siehe auch