ICorProfilerCallback4::MovedReferences2 – metoda
Volá se pro hlášení nového rozložení objektů v haldě v důsledku komprimace uvolňování paměti. Tato metoda je volána, pokud profiler implementoval ICorProfilerCallback4 rozhraní. Toto zpětné volání nahrazuje ICorProfilerCallback::MovedReferences metoda, protože může hlásit větší rozsahy objektů, jejichž délky překračují to, co lze vyjádřit v ULONG.
Syntaxe
HRESULT MovedReferences2(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] SIZE_T cObjectIDRangeLength[] );
Parametry
cMovedObjectIDRanges
[v] Počet bloků souvislých objektů, které se přesunuly v důsledku komprimace uvolňování paměti. To znamená, že hodnota cMovedObjectIDRanges
je celková velikost oldObjectIDRangeStart
polí , newObjectIDRangeStart
a cObjectIDRangeLength
.
Další tři argumenty jsou MovedReferences2
paralelní pole. Jinými slovy , oldObjectIDRangeStart[i]
newObjectIDRangeStart[i]
a cObjectIDRangeLength[i]
se týkají jednoho bloku souvislých objektů.
oldObjectIDRangeStart
[v] Pole ObjectID
hodnot, z nichž každá je starou počáteční adresou 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á je novou počáteční adresou bloku souvislých živých objektů v paměti (po uvolnění paměti).
cObjectIDRangeLength
[v] Pole celých čísel, z nichž každé má velikost bloku souvislých objektů v paměti.
Pro každý blok, na který se odkazuje v oldObjectIDRangeStart
polích a newObjectIDRangeStart
, je určena velikost.
Poznámky
Komprimující systém uvolňování paměti uvolní paměť zabíranou mrtvými objekty a kompakty, které uvolnily místo. V důsledku toho mohou být živé objekty přesunuty v rámci haldy 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 k 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 MovedReferences2
hodnot není platná během samotného zpětného volání, protože systém 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 MovedReferences2
volání. Zpětné volání ICorProfilerCallback2::GarbageCollectionFinished označuje, že všechny objekty byly přesunuty do svých nových umístění a je možné provést kontrolu.
Pokud profiler implementuje ICorProfilerCallback a ICorProfilerCallback4 rozhraní, MovedReferences2
metoda je volána před ICorProfilerCallback::MovedReferences metoda, ale pouze v případě, že MovedReferences2
metoda vrátí úspěšně. Profilátory můžou vrátit hodnotu HRESULT, která indikuje selhání metody MovedReferences2
, aby se zabránilo volání druhé metody.
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 4.5