ICorProfilerCallback::MovedReferences-Methode
Aktualisiert: November 2007
Wird aufgerufen, um ein neues Layout von Objekten im Heap als Folge einer komprimierenden Garbage Collection zu melden.
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. In 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 ist.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 ist.cObjectIDRangeLength
[in] Ein Array von Ganzzahlen, von denen jede die Größe eines Blocks zusammenhängender Objekte im Arbeitsspeicher ist.Eine Größe wird für jeden Block angegeben, auf den im oldObjectIDRangeStart-Array und im newObjectIDRangeStart-Array verwiesen wird.
Hinweise
Ein komprimierender Garbage Collector gibt den Arbeitsspeicher frei, der von inaktiven Objekten und Komprimierungen belegt wird, die Speicherplatz freigegeben haben. Als Folge werden aktive Objekte möglicherweise innerhalb des Heaps verschoben, und ObjectID-Werte, die von vorherigen Benachrichtigung verteilt wurden, können geändert werden.
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 irgendeinen Wert i, der im folgenden Bereich ist:
0 <= i < cMovedObjectIDRanges
Sie können die neue ObjectID wie folgt berechnen:
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
Keiner der ObjectID-Werte, die von MovedReferences übergeben wurden, sind während des Rückrufs selbst gültig, weil die Garbage Collection zu diesem Zeitpunkt unter Umständen noch Objekte von alten Speicherorten an neue Speicherorte verschiebt. Deshalb dürfen 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.
Weitere Informationen darüber, wie die Profilerstellungs-API ObjectID-Werte verfolgt, finden Sie unter Objektverfolgung in der Profilerstellungs-API.
Anforderungen
Plattformen: siehe Systemanforderungen für .NET Framework.
Header: CorProf.idl
Bibliothek: CorGuids.lib
.NET Framework-Versionen: 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0
Siehe auch
Referenz
ICorProfilerCallback-Schnittstelle