다음을 통해 공유


프로파일링 API의 가비지 수집

프로파일러는 가비지 수집 알림을 받을 수 있습니다.

사용자가 COR_PRF_MONITOR_GC 플래그를 지정하면 ICorProfilerCallback::ObjectAllocated 이벤트를 제외한 모든 가비지 수집 이벤트가 프로파일러에서 발생합니다. ObjectAllocated 이벤트는 성능상의 이유로 COR_PRF_MONITOR_OBJECT_ALLOCATED 플래그에 의해 명시적으로 제어됩니다. COR_PRF_MONITOR_GC 플래그를 사용하면 동시 가비지 수집이 해제됩니다.

.NET Framework 버전 1.0과 1.1에서 일시 중단 원인이 COR_PRF_SUSPEND_FOR_GC일 경우 코드 프로파일러가 ICorProfilerCallback::RuntimeSuspendFinishedICorProfilerCallback::RuntimeResumeStarted 콜백을 모니터링하여 가비지 수집이 발생하는지 확인합니다. 종료하는 동안 CLR도 일시 중단됩니다. 그리고 런타임이 이미 일시 중단된 상태이므로 코드 프로파일러에 알리지 않고 하나 이상의 가비지 수집이 발생할 수 있습니다. 이러한 상황에서는 가비지 수집 완료를 쉽게 감지할 수 없습니다. 코드 프로파일러에서는 ICorProfilerCallback::ObjectReferences 또는 ICorProfilerCallback::RootReferences 콜백 후에 발생한 첫 번째 ObjectAllocated 콜백을 감지해야 합니다.

.NET Framework 버전 2.0 이상에서 코드 프로파일러는 ICorProfilerCallback2::GarbageCollectionStartedICorProfilerCallback2::GarbageCollectionFinished 콜백을 사용하여 가비지 수집이 발생하는지 확인하고 해당되는 세대를 식별할 수 있습니다. 가비지 수집 세대에 대한 자세한 내용은 COR_PRF_GC_GENERATION 열거형을 참조하십시오. 이러한 콜백에는 이전 단원에서 설명한 종료 문제가 없습니다.

참고참고

이전에 IA-64라고 부르던 Intel Itanium 아키텍처를 구현하는 64비트 시스템에서 WOW64 x86 에뮬레이터를 실행하는 응용 프로그램에서는 동시 가비지 수집이 지원되지 않습니다.64비트 Windows 시스템에서 WOW64를 사용하는 방법에 대한 자세한 내용은 Running 32-bit Applications를 참조하십시오.

가비지 수집 차단

공용 언어 런타임에서 ICorProfilerCallback 인터페이스의 특정 메서드를 호출하는 경우 프로파일러가 해당 호출에서 제어를 반환해야 런타임에서 가비지 수집을 수행할 수 있습니다. 이는 프로파일링 서비스에서 가비지 수집에 대해 안전한 상태로 스택을 생성하지 못하는 경우도 있기 때문입니다. 대신 콜백에는 가비지 수집을 사용할 수 없습니다. 이러한 경우 프로파일러에서 최대한 빨리 컨트롤을 반환해야 합니다. 이 상황은 다음과 같은 콜백에 적용됩니다.

또한 다음 콜백에서는 프로파일러가 fIsSafeToBlock 매개 변수를 사용하여 호출별로 가비지 수집을 블로킹할 수 있습니다.

프로파일러에서 가비지 수집을 블로킹하지 않을 경우 가비지 수집을 지연합니다. 프로파일러가 가비지 수집을 트리거하거나 관리되는 힙의 공간을 할당하는 CLR 함수를 호출하지 않으면 가비지 수집을 지연해도 아무 지장이 없습니다.

참고 항목

개념

프로파일링 개요