ICorProfilerCallback::MovedReferences – metoda
Volána k hlášení nového rozložení objektů v haldě v důsledku komprimace uvolňování paměti.
Syntaxe
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
Parametry
cMovedObjectIDRanges
[v] Počet bloků souvislých objektů, které se přesunuly v důsledku uvolňování paměti komprimace. To znamená, že hodnota cMovedObjectIDRanges
je celková velikost oldObjectIDRangeStart
polí , newObjectIDRangeStart
a cObjectIDRangeLength
.
Další tři argumenty jsou MovedReferences
paralelní pole. Jinými slovy , oldObjectIDRangeStart[i]
newObjectIDRangeStart[i]
a cObjectIDRangeLength[i]
všechny se týkají jednoho bloku souvislých objektů.
oldObjectIDRangeStart
[v] Pole ObjectID
hodnot, z nichž každá představuje starou počáteční adresu bloku souvislých živých objektů v paměti (před uvolňováním paměti).
newObjectIDRangeStart
[v] Pole ObjectID
hodnot, z nichž každá představuje novou počáteční adresu (po uvolnění paměti) bloku souvislých živých objektů v paměti.
cObjectIDRangeLength
[v] Pole celých čísel, z nichž každé představuje velikost bloku souvislých objektů v paměti.
Velikost je určena pro každý blok, na který se odkazuje v oldObjectIDRangeStart
polích a newObjectIDRangeStart
.
Poznámky
Důležité
Tato metoda hlásí velikosti objektů MAX_ULONG
, které jsou větší než 4 GB na 64bitových platformách. Chcete-li získat velikost objektů, které jsou větší než 4 GB, použijte místo toho metodu ICorProfilerCallback4::MovedReferences2 .
Komprimující systém uvolňování paměti uvolní paměť zabírající mrtvé objekty a komprimuje, které uvolní místo. V důsledku toho se živé objekty můžou přesouvat v haldě a ObjectID
hodnoty distribuované předchozími oznámeními se můžou změnit.
Předpokládejme, že existující ObjectID
hodnota (oldObjectID
) leží v následujícím rozsahu:
oldObjectIDRangeStart[i]
<= oldObjectID
<oldObjectIDRangeStart[i]
+ cObjectIDRangeLength[i]
V tomto případě je posun od začátku rozsahu do začátku objektu následující:
oldObjectID
- oldObjectRangeStart[i]
Pro libovolnou i
hodnotu, která je v následujícím rozsahu:
0 <= i
<cMovedObjectIDRanges
Nový ObjectID
kód můžete vypočítat následujícím způsobem:
newObjectID
= newObjectIDRangeStart[i]
+ (oldObjectID
– oldObjectIDRangeStart[i]
)
Žádná z ObjectID
předaných MovedReferences
hodnot není platná během samotného zpětného volání, protože uvolňování paměti může být uprostřed přesouvání objektů ze starých umístění do nových umístění. Proto by se profilátory neměly pokoušet kontrolovat objekty během MovedReferences
volání. Zpětné volání ICorProfilerCallback2::GarbageCollectionFinished označuje, že všechny objekty byly přesunuty do nových umístění a lze provést kontrolu.
Požadavky
Platformy: Viz Požadavky na systém.
Záhlaví: CorProf.idl, CorProf.h
Knihovny: CorGuids.lib
Verze rozhraní .NET Framework: K dispozici od verze 2.0