Sdílet prostřednictvím


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

Viz také