ICorProfilerCallback::MovedReferences-metod
Anropas för att rapportera den nya layouten för objekt i heapen som ett resultat av en komprimerande skräpinsamling.
Syntax
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
Parametrar
cMovedObjectIDRanges
[i] Antalet block med sammanhängande objekt som har flyttats till följd av den komprimerade skräpinsamlingen. Värdet cMovedObjectIDRanges
för är alltså den totala storleken på matriserna oldObjectIDRangeStart
, newObjectIDRangeStart
och cObjectIDRangeLength
.
De följande tre argumenten MovedReferences
i är parallella matriser. Med andra ord gäller oldObjectIDRangeStart[i]
, newObjectIDRangeStart[i]
, och cObjectIDRangeLength[i]
alla ett enda block med sammanhängande objekt.
oldObjectIDRangeStart
[i] En matris med ObjectID
värden, som var och en är den gamla startadressen (för skräpinsamling) för ett block med sammanhängande, levande objekt i minnet.
newObjectIDRangeStart
[i] En matris med ObjectID
värden, som var och en är den nya startadressen (efter skräpinsamling) för ett block med sammanhängande, levande objekt i minnet.
cObjectIDRangeLength
[i] En matris med heltal, var och en är storleken på ett block med sammanhängande objekt i minnet.
En storlek anges för varje block som refereras till i matriserna oldObjectIDRangeStart
och newObjectIDRangeStart
.
Kommentarer
Viktigt
Den här metoden rapporterar storlekar som MAX_ULONG
för objekt som är större än 4 GB på 64-bitarsplattformar. Om du vill hämta storleken på objekt som är större än 4 GB använder du ICorProfilerCallback4::MovedReferences2-metoden i stället.
En komprimerande skräpsamlare återtar minnet som upptas av döda föremål och komprimerar som frigör utrymme. Därför kan levande objekt flyttas inom heapen, och ObjectID
värden som distribuerats av tidigare meddelanden kan ändras.
Anta att ett befintligt ObjectID
värde (oldObjectID
) ligger inom följande intervall:
oldObjectIDRangeStart[i]
<= oldObjectID
<oldObjectIDRangeStart[i]
+ cObjectIDRangeLength[i]
I det här fallet är förskjutningen från början av intervallet till början av objektet följande:
oldObjectID
- oldObjectRangeStart[i]
För alla värden i
för detta ligger i följande intervall:
0 <= i
<cMovedObjectIDRanges
du kan beräkna det nya ObjectID
på följande sätt:
newObjectID
= newObjectIDRangeStart[i]
+ (oldObjectID
– oldObjectIDRangeStart[i]
)
Inget av de värden som ObjectID
skickas MovedReferences
är giltiga under återanropet, eftersom skräpinsamlingen kan vara mitt i att flytta objekt från gamla platser till nya platser. Profilerare bör därför inte försöka inspektera objekt under ett MovedReferences
anrop. Ett ICorProfilerCallback2::GarbageCollectionFinished-återanrop anger att alla objekt har flyttats till sina nya platser och att inspektion kan utföras.
Krav
Plattformar: Se Systemkrav.
Huvudet: CorProf.idl, CorProf.h
Bibliotek: CorGuids.lib
.NET Framework versioner: Tillgänglig sedan 2.0