ICorProfilerCallback4::MovedReferences2-Methode
Wird aufgerufen, um das neue Layout von Objekten im Heap als Folge einer komprimierenden Garbage Collection zu melden. Diese Methode wird aufgerufen, wenn der Profiler die ICorProfilerCallback4-Schnittstelle implementiert hat. Dieser Rückruf ersetzt die ICorProfilerCallback::MovedReferences-Methode, weil er größere Bereiche von Objekten melden kann, deren Länge den Wert überschreitet, der in einem ULONG-Typ ausgedrückt werden kann.
Syntax
HRESULT MovedReferences2(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] SIZE_T 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 MovedReferences2
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
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 MovedReferences2
übergeben wurden, ist während des Rückrufs selbst gültig, weil der Garbage Collector zu diesem Zeitpunkt möglicherweise noch Objekte von alten Speicherorten an neue Speicherorte verschiebt. Deshalb sollten Profiler nicht versuchen, Objekte während eines MovedReferences2
-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.
Wenn der Profiler die ICorProfilerCallback- und die ICorProfilerCallback4-Schnittstelle implementiert, wird die MovedReferences2
-Methode vor der ICorProfilerCallback::MovedReferences-Methode aufgerufen. Dies geschieht jedoch nur, wenn die MovedReferences2
-Methode erfolgreich zurückgegeben wird. Profiler können ein HRESULT von der Methode MovedReferences2
zurückgeben, um zu vermeiden, dass die zweite Methode aufgerufen wird.
Anforderungen
Plattformen: Informationen finden Sie unter Systemanforderungen.
Header: CorProf.idl, CorProf.h
Bibliothek: CorGuids.lib
.NET Framework-Versionen: seit Version 4.5 verfügbar