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]
+ (oldObjectID
– oldObjectIDRangeStart[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.