ICorProfilerCallback4::MovedReferences2 – metoda

Volá se k 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í, 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 jako výsledek komprimace uvolňování paměti. To znamená, že hodnota cMovedObjectIDRanges je celková velikost oldObjectIDRangeStart, newObjectIDRangeStarta cObjectIDRangeLength pole.

Další tři argumenty MovedReferences2 jsou paralelní pole. Jinými slovy , oldObjectIDRangeStart[i]a newObjectIDRangeStart[i]cObjectIDRangeLength[i] všechny se týkají jediného bloku souvislých objektů.

oldObjectIDRangeStart [v] Pole ObjectID hodnot, z nichž každá je stará (před uvolňováním paměti) počáteční adresa bloku souvislých živých objektů v paměti.

newObjectIDRangeStart [v] ObjectID Pole hodnot, z nichž každý je novou počáteční adresou (po uvolnění paměti) bloku souvislých živých objektů v paměti.

cObjectIDRangeLength [v] Pole celých čísel, z nichž každá je velikost bloku souvislých objektů v paměti.

Pro každý blok, na který se odkazuje v oldObjectIDRangeStartnewObjectIDRangeStart polích, je zadána velikost.

Poznámky

Komprimace uvolňování paměti uvolní paměť obsazenou mrtvými objekty a komprimuje, které uvolnilo místo. V důsledku toho se živé objekty můžou přesunout 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 oblasti na začátek objektu následující:

oldObjectID - oldObjectRangeStart[i]

Pro libovolnou hodnotu i , která je v následujícím rozsahu:

0 <= i<cMovedObjectIDRanges

Nové ObjectID 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 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átoři neměli pokoušet kontrolovat objekty během MovedReferences2 volání. ICorProfilerCallback2::GarbageCollectionFinished zpětné volání označuje, že všechny objekty byly přesunuty do jejich nových umístění a kontrola lze provést.

Pokud profiler implementuje ICorProfilerCallback i ICorProfilerCallback4 rozhraní, MovedReferences2 metoda je volána před ICorProfilerCallback::MovedReferences metoda, ale pouze pokud MovedReferences2 metoda vrátí úspěšně. Profilátory můžou vrátit hodnotu HRESULT, která značí 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

Knihovna: CorGuids.lib

Verze rozhraní .NET Framework: K dispozici od verze 4.5

Viz také