프로파일링 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::RuntimeSuspendFinished 및 ICorProfilerCallback::RuntimeResumeStarted 콜백을 모니터링하여 가비지 수집이 발생하는지 확인합니다. 종료하는 동안 CLR도 일시 중단됩니다. 그리고 런타임이 이미 일시 중단된 상태이므로 코드 프로파일러에 알리지 않고 하나 이상의 가비지 수집이 발생할 수 있습니다. 이러한 상황에서는 가비지 수집 완료를 쉽게 감지할 수 없습니다. 코드 프로파일러에서는 ICorProfilerCallback::ObjectReferences 또는 ICorProfilerCallback::RootReferences 콜백 후에 발생한 첫 번째 ObjectAllocated 콜백을 감지해야 합니다.
.NET Framework 버전 2.0 이상에서 코드 프로파일러는 ICorProfilerCallback2::GarbageCollectionStarted 및 ICorProfilerCallback2::GarbageCollectionFinished 콜백을 사용하여 가비지 수집이 발생하는지 확인하고 해당되는 세대를 식별할 수 있습니다. 가비지 수집 세대에 대한 자세한 내용은 COR_PRF_GC_GENERATION 열거형을 참조하십시오. 이러한 콜백에는 이전 단원에서 설명한 종료 문제가 없습니다.
참고 |
---|
이전에 IA-64라고 부르던 Intel Itanium 아키텍처를 구현하는 64비트 시스템에서 WOW64 x86 에뮬레이터를 실행하는 응용 프로그램에서는 동시 가비지 수집이 지원되지 않습니다.64비트 Windows 시스템에서 WOW64를 사용하는 방법에 대한 자세한 내용은 Running 32-bit Applications를 참조하십시오. |
가비지 수집 차단
공용 언어 런타임에서 ICorProfilerCallback 인터페이스의 특정 메서드를 호출하는 경우 프로파일러가 해당 호출에서 제어를 반환해야 런타임에서 가비지 수집을 수행할 수 있습니다. 이는 프로파일링 서비스에서 가비지 수집에 대해 안전한 상태로 스택을 생성하지 못하는 경우도 있기 때문입니다. 대신 콜백에는 가비지 수집을 사용할 수 없습니다. 이러한 경우 프로파일러에서 최대한 빨리 컨트롤을 반환해야 합니다. 이 상황은 다음과 같은 콜백에 적용됩니다.
ICorProfilerCallback::ExceptionOSHandlerEnter, ICorProfilerCallback::ExceptionOSHandlerLeave
ICorProfilerCallback::ExceptionUnwindFunctionEnter, ICorProfilerCallback::ExceptionUnwindFunctionLeave
ICorProfilerCallback::ExceptionUnwindFunctionEnter, ICorProfilerCallback::ExceptionUnwindFunctionLeave
ICorProfilerCallback::ExceptionCatcherEnter, ICorProfilerCallback::ExceptionCatcherLeave
ICorProfilerCallback::ExceptionCLRCatcherFound, ICorProfilerCallback::ExceptionCLRCatcherExecute
ICorProfilerCallback::COMClassicVTableCreated, ICorProfilerCallback::COMClassicVTableDestroyed
또한 다음 콜백에서는 프로파일러가 fIsSafeToBlock 매개 변수를 사용하여 호출별로 가비지 수집을 블로킹할 수 있습니다.
프로파일러에서 가비지 수집을 블로킹하지 않을 경우 가비지 수집을 지연합니다. 프로파일러가 가비지 수집을 트리거하거나 관리되는 힙의 공간을 할당하는 CLR 함수를 호출하지 않으면 가비지 수집을 지연해도 아무 지장이 없습니다.