Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Wywoływana w celu raportowania nowego układu obiektów w stercie w wyniku kompaktowania odzyskiwania pamięci. Ta metoda jest wywoływana, jeśli profiler zaimplementował interfejs ICorProfilerCallback4 . To wywołanie zwrotne zastępuje metodę ICorProfilerCallback::MovedReferences , ponieważ może zgłaszać większe zakresy obiektów, których długość przekracza to, co można wyrazić w ULONG.
Składnia
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 [in] Liczba bloków ciągłych obiektów, które zostały przeniesione w wyniku kompaktowania odzyskiwania pamięci. Oznacza to, że wartość parametru cMovedObjectIDRanges to całkowity rozmiar oldObjectIDRangeStarttablic , newObjectIDRangeStarti cObjectIDRangeLength .
Następne trzy argumenty MovedReferences2 to tablice równoległe. Innymi słowy, oldObjectIDRangeStart[i], newObjectIDRangeStart[i]i cObjectIDRangeLength[i] wszystkie dotyczą jednego 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łych, żywych obiektów w pamięci.
newObjectIDRangeStart [in] Tablica ObjectID wartości, z których każda jest nowym adresem początkowym (po wyrzucaniu pamięci) bloku ciągłych obiektów na żywo 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 tablica i newObjectIDRangeStart .
Uwagi
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) mieści się w następującym zakresie:
oldObjectIDRangeStart[i]
<= oldObjectID<oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
W takim przypadku przesunięcie od początku zakresu do początku obiektu jest następujące:
oldObjectID - oldObjectRangeStart[i]
Dla dowolnej wartości i tej wartości 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])
Żadne z ObjectID przekazanych MovedReferences2 wartości nie są prawidłowe podczas samego wywołania zwrotnego, ponieważ moduł odśmiecający 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 MovedReferences2 .
Wywołanie zwrotne ICorProfilerCallback2::GarbageCollectionFinished wskazuje, że wszystkie obiekty zostały przeniesione do nowych lokalizacji i można przeprowadzić inspekcję.
Jeśli profiler implementuje interfejsy ICorProfilerCallback i ICorProfilerCallback4 , MovedReferences2 metoda jest wywoływana przed metodą ICorProfilerCallback::MovedReferences , ale tylko wtedy, gdy MovedReferences2 metoda zwróci powodzenie. Profilerzy mogą zwrócić hrESULT, który wskazuje błąd z MovedReferences2 metody, aby uniknąć wywoływania drugiej metody.
Requirements
Platformy: Zobacz Wymagania systemowe.
Nagłówek: CorProf.idl, CorProf.h
Biblioteka: CorGuids.lib
Wersje programu .NET Framework: Dostępne od wersji 4.5