다음을 통해 공유


ICorProfilerCallback2::SurvivingReferences 메서드

비압축 가비지 수집의 결과로 힙에 있는 개체의 레이아웃을 보고합니다.

구문

HRESULT SurvivingReferences(  
    [in] ULONG  cSurvivingObjectIDRanges,  
    [in, size_is(cSurvivingObjectIDRanges)] ObjectID  
                objectIDRangeStart[] ,  
    [in, size_is(cSurvivingObjectIDRanges)] ULONG  
                cObjectIDRangeLength[] );  

매개 변수

cSurvivingObjectIDRanges
[in] 비압축 가비지 수집 후에 유지된 연속 개체 블록 수입니다. 즉, cSurvivingObjectIDRanges 값은 각 개체 블록의 ObjectID 및 길이를 각각 저장하는 objectIDRangeStartcObjectIDRangeLength 배열의 크기입니다.

SurvivingReferences의 다음 두 인수는 병렬 배열입니다. 즉, objectIDRangeStartcObjectIDRangeLength는 동일한 연속 개체 블록과 관련이 있습니다.

objectIDRangeStart
[in] 메모리에서 연속 라이브 개체 블록의 시작 주소를 각각 나타내는 ObjectID 값의 배열입니다.

cObjectIDRangeLength
[in] 메모리에 유지되는 연속 개체 블록의 크기를 각각 나타내는 정수 배열입니다.

크기는 objectIDRangeStart 배열에서 참조된 각 블록에 대해 지정됩니다.

설명

중요

이 메서드는 64비트 플랫폼에서 4GB보다 큰 개체의 크기를 MAX_ULONG으로 보고합니다. 4GB보다 큰 개체에는 ICorProfilerCallback4::SurvivingReferences2 메서드를 사용합니다.

개체가 가비지 수집 후에 유지되었는지 여부를 확인하려면 objectIDRangeStartcObjectIDRangeLength 배열의 요소를 다음과 같이 해석해야 합니다. ObjectID 값(ObjectID)이 다음 범위 내에 있다고 가정합니다.

ObjectIDRangeStart[i]<= ObjectID<ObjectIDRangeStart[i] + cObjectIDRangeLength[i]

i 값이 다음 범위에 있는 경우 개체가 가비지 수집 후에 유지되었습니다.

0 <= i<cSurvivingObjectIDRanges

비압축 가비지 컬렉션은 "데드" 개체가 사용한 메모리를 회수하지만 확보된 공간을 압축하지는 않습니다. 따라서 메모리가 힙에 반환되지만 "라이브" 개체는 이동되지 않습니다.

CLR(공용 언어 런타임)은 비압축 가비지 수집을 위해 SurvivingReferences를 호출합니다. 압축 가비지 수집의 경우 대신 ICorProfilerCallback::MovedReferences가 호출됩니다. 한 세대는 단일 가비지 수집을 압축하고 다른 세대는 압축하지 않을 수 있습니다. 특정 세대의 가비지 컬렉션에 대해 프로파일러는 SurvivingReferences 콜백이나 MovedReferences 콜백 중 하나를 받게 되며 둘 다 받을 수는 없습니다.

제한된 내부 버퍼링, 서버 가비지 컬렉션 시 여러 스레드 보고 및 기타 이유로 인해 특정 가비지 컬렉션 중 SurvivingReferences 콜백을 여러 개 받을 수도 있습니다. 가비지 컬렉션 중 여러 콜백이 발생하는 경우 정보가 누적됩니다. SurvivingReferences 콜백에 보고된 모든 참조가 가비지 컬렉션 후에 유지됩니다.

요구 사항

플랫폼:시스템 요구 사항을 참조하세요.

헤더: CorProf.idl, CorProf.h

라이브러리: CorGuids.lib

.NET Framework 버전: 2.0부터 사용 가능

참고 항목