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 oldObjectIDRangeStart
tablic , newObjectIDRangeStart
i 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]
+ (oldObjectID
– oldObjectIDRangeStart[i]
)
Żadna z przekazanych ObjectID
MovedReferences
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