압축 가비지 수집으로 인한 힙의 새 개체 레이아웃을 보고하기 위해 호출됩니다.
HRESULT MovedReferences(
[in] ULONG cMovedObjectIDRanges,
[in, size_is(cMovedObjectIDRanges)] ObjectID oldObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ObjectID newObjectIDRangeStart[] ,
[in, size_is(cMovedObjectIDRanges)] ULONG cObjectIDRangeLength[] );
매개 변수
cMovedObjectIDRanges
[in] 압축 가비지 수집의 결과로 이동된 연속적 개체 블록의 수입니다. 즉 cMovedObjectIDRanges의 값은 oldObjectIDRangeStart, newObjectIDRangeStart 및 cObjectIDRangeLength 배열의 총 크기입니다.MovedReferences의 다음 세 인수는 병렬 배열입니다. 즉, oldObjectIDRangeStart[i], newObjectIDRangeStart[i] 및 cObjectIDRangeLength[i]는 모두 연속적 개체의 단일 블록에 관련됩니다.
oldObjectIDRangeStart
[in] 메모리에 있는 연속적 활성 개체 블록의 이전(가비지 수집 전) 시작 주소를 나타내는 각 ObjectID 값의 배열입니다.newObjectIDRangeStart
[in] 메모리에 있는 연속적 활성 개체 블록의 새(가비지 수집 후) 시작 주소를 나타내는 각 ObjectID 값의 배열입니다.cObjectIDRangeLength
[in] 메모리에 있는 연속적 개체 블록의 크기를 나타내는 각 정수의 배열입니다.크기는 oldObjectIDRangeStart 및 newObjectIDRangeStart 배열에서 참조되는 각 블록에 대해 지정됩니다.
설명
압축 가비지 수집기는 비활성 개체에서 사용한 메모리를 회수하고 확보된 해당 공간을 압축합니다. 따라서 활성 개체가 힙 내에서 이동할 수 있으며 이전 알림에서 전달된 ObjectID 값이 변경될 수 있습니다.
기존 ObjectID 값(oldObjectID)이 다음 범위 내에 있다고 가정합니다.
oldObjectIDRangeStart[i] <= oldObjectID < oldObjectIDRangeStart[i] + cObjectIDRangeLength[i]
이 경우 범위 시작부터 개체 시작까지의 오프셋은 다음과 같습니다.
oldObjectID - oldObjectRangeStart[i]
임의의 i 값이 다음 범위에 있으면
0 <= i < cMovedObjectIDRanges
새 ObjectID를 다음과 같이 계산할 수 있습니다.
newObjectID = newObjectIDRangeStart[i] + (oldObjectID – oldObjectIDRangeStart[i])
콜백 중에는 가비지 수집 과정에서 개체를 이전 위치에서 새 위치로 이동하는 중일 수 있으므로 MovedReferences에서 전달된 ObjectID 값이 유효하지 않습니다. 따라서 MovedReferences를 호출하는 동안에는 프로파일러가 개체를 검사하지 않아야 합니다. ICorProfilerCallback2::GarbageCollectionFinished 콜백이 호출되면 모든 개체가 새 위치로 이동된 것이므로 검사를 수행할 수 있습니다.
프로파일링 API에서 ObjectID 값을 추적하는 방법에 대한 자세한 내용은 프로파일링 API의 개체 추적을 참조하십시오.
요구 사항
플랫폼: .NET Framework 시스템 요구 사항 참조
헤더: CorProf.idl, CorProf.h
라이브러리: CorGuids.lib
.NET Framework 버전: 4, 3.5 SP1, 3.5, 3.0 SP1, 3.0, 2.0 SP1, 2.0