Udostępnij za pośrednictwem


ICorProfilerCallback::MovedReferences — Metoda

Wywoływana w celu raportowania nowego układu obiektów w stercie w wyniku kompaktowania odzyskiwania pamięci.

Składnia

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
[in] Liczba bloków ciągłych obiektów, które zostały przeniesione w wyniku kompaktowania pamięci. Oznacza to, że wartość parametru cMovedObjectIDRanges jest łącznym rozmiarem oldObjectIDRangeStarttablic , newObjectIDRangeStarti cObjectIDRangeLength .

Następne trzy argumenty MovedReferences funkcji to tablice równoległe. Innymi słowy, oldObjectIDRangeStart[i], newObjectIDRangeStart[i]i cObjectIDRangeLength[i] dotyczą pojedynczego bloku ciągłych obiektów.

oldObjectIDRangeStart
[in] Tablica ObjectID wartości, z których każda jest starym (przed odzyskiwaniem pamięci) początkowym adresem bloku ciągłego, dynamicznego obiektu w pamięci.

newObjectIDRangeStart
[in] Tablica ObjectID wartości, z których każda jest nowym (pośmiertnym odzyskiwaniem pamięci) adresem początkowym bloku ciągłego, dynamicznego obiektu w pamięci.

cObjectIDRangeLength
[in] Tablica liczb całkowitych, z których każda jest wielkością bloku ciągłych obiektów w pamięci.

Rozmiar jest określany dla każdego bloku, do którego odwołuje się oldObjectIDRangeStart obiekt i newObjectIDRangeStart tablic.

Uwagi

Ważne

Ta metoda zgłasza rozmiary MAX_ULONG obiektów, które są większe niż 4 GB na platformach 64-bitowych. Aby uzyskać rozmiar obiektów większych niż 4 GB, zamiast tego użyj metody ICorProfilerCallback4::MovedReferences2 .

Kompaktowanie modułu odśmiecania pamięci odzyskuje pamięć zajmowaną przez martwe obiekty i kompakty, które zwolniły miejsce. W związku z tym obiekty na żywo mogą zostać przeniesione w stercie, a ObjectID wartości dystrybuowane przez poprzednie powiadomienia mogą ulec zmianie.

Załóżmy, że istniejąca ObjectID wartość (oldObjectID) znajduje się w następującym zakresie:

oldObjectIDRangeStart[i]<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]

W tym przypadku przesunięcie od początku zakresu do początku obiektu jest następujące:

oldObjectID - oldObjectRangeStart[i]

Dla dowolnej wartości i , która znajduje się w następującym zakresie:

0 <= i<cMovedObjectIDRanges

Możesz obliczyć nowe ObjectID w następujący sposób:

newObjectID = newObjectIDRangeStart[i] + (oldObjectIDoldObjectIDRangeStart[i])

Żadna z przekazanych ObjectIDMovedReferences wartości nie jest prawidłowa podczas samego wywołania zwrotnego, ponieważ odzyskiwanie pamięci może znajdować się w środku przenoszenia obiektów ze starych lokalizacji do nowych lokalizacji. W związku z tym profilerzy nie powinni próbować sprawdzać obiektów podczas wywołania MovedReferences . Wywołanie zwrotne ICorProfilerCallback2::GarbageCollectionFinished wskazuje, że wszystkie obiekty zostały przeniesione do nowych lokalizacji i można przeprowadzić inspekcję.

Wymagania

Platformy: Zobacz Wymagania systemowe.

Nagłówka: CorProf.idl, CorProf.h

Biblioteki: CorGuids.lib

wersje .NET Framework: dostępne od wersji 2.0

Zobacz też