Sdílet prostřednictvím


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 oldObjectIDRangeStartpolí , newObjectIDRangeStarta 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] + (oldObjectIDoldObjectIDRangeStart[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

Viz také