ICorProfilerCallback4::MovedReferences2-metod

Anropas för att rapportera den nya layouten för objekt i heapen som ett resultat av en komprimerande skräpinsamling. Den här metoden anropas om profileraren har implementerat gränssnittet ICorProfilerCallback4 . Den här motringningen ersätter metoden ICorProfilerCallback::MovedReferences eftersom den kan rapportera större intervall med objekt vars längd överskrider vad som kan uttryckas i en ULONG.

Syntax

HRESULT MovedReferences2(  
    [in]  ULONG  cMovedObjectIDRanges,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,  
    [in, size_is(cMovedObjectIDRanges)] SIZE_T    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, newObjectIDRangeStartoch cObjectIDRangeLength .

De följande tre argumenten MovedReferences2 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

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] + (oldObjectIDoldObjectIDRangeStart[i])

Inget av de värden som ObjectID skickas MovedReferences2 är giltiga under återanropet, eftersom skräpinsamlaren 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 MovedReferences2 anrop. Ett ICorProfilerCallback2::GarbageCollectionFinished-återanrop anger att alla objekt har flyttats till sina nya platser och att inspektion kan utföras.

Om profileraren implementerar både ICorProfilerCallback - och ICorProfilerCallback4-gränssnittenMovedReferences2 anropas metoden före metoden ICorProfilerCallback::MovedReferences , men bara om MovedReferences2 metoden returneras korrekt. Profilerare kan returnera en HRESULT som indikerar ett fel från MovedReferences2 metoden för att undvika att anropa den andra metoden.

Krav

Plattformar: Se Systemkrav.

Huvudet: CorProf.idl, CorProf.h

Bibliotek: CorGuids.lib

.NET Framework versioner: Tillgänglig sedan 4.5

Se även