Recolección de elementos no utilizados en la API de generación de perfiles
Los generadores de perfiles pueden recibir notificaciones de recolección de elementos no utilizados.
Cuando el usuario especifica la marca COR_PRF_MONITOR_GC, se generarán todos los eventos de recolección de elementos no utilizados salvo los eventos ICorProfilerCallback::ObjectAllocated en el generador de perfiles. La marca COR_PRF_MONITOR_OBJECT_ALLOCATED controla explícitamente los eventos ObjectAllocated por razones de rendimiento. Tenga en cuenta que cuando se habilita el marcador COR_PRF_MONITOR_GC, se desactiva la recolección simultánea de elementos no utilizados.
En la versión 1.0 y 1.1 de .NET Framework, el generador de perfiles de código determina que la recolección de elementos no utilizados está teniendo lugar mediante la supervisión de devoluciones de llamada ICorProfilerCallback::RuntimeResumeStarted e ICorProfilerCallback::RuntimeSuspendFinished cuando la razón de la suspensión es COR_PRF_SUSPEND_FOR_GC. Durante el cierre, Common Language Runtime (CLR) se suspende también, y pueden tener lugar una o más recolecciones de elementos no utilizados sin notificación al generador de perfiles del código, porque el motor en tiempo de ejecución ya está en un estado suspendido. Detectar la finalización de la recopilación de elementos no utilizados en esas circunstancias no es trivial. El generador de perfiles de código tiene que detectar la primera devolución de llamada ObjectAllocated que tenga lugar después de una devolución de llamada ICorProfilerCallback::ObjectReferences o ICorProfilerCallback::RootReferences.
En la versión 2.0 de .NET Framework y posteriores, el generador de perfiles de código puede utilizar las devoluciones de llamada ICorProfilerCallback2::GarbageCollectionFinished e ICorProfilerCallback2::GarbageCollectionStarted para determinar que esa recolección de elementos no utilizados está teniendo lugar y para identificar qué generaciones se cubren. (Para obtener más información sobre las generaciones de recolección de elementos no utilizados, vea la enumeración COR_PRF_GC_GENERATION.) Estas devoluciones de llamada no tienen el problema de cierre mencionado en la sección anterior.
Nota |
---|
No se admite la recolección simultánea de elementos no utilizados en aplicaciones en las que se ejecuta el emulador WOW64 x86 en sistemas de 64 bits y que implementan la arquitectura Intel Itanium (denominada anteriormente IA-64).Para obtener más información sobre el uso de WOW64 en sistemas Windows de 64 bits, vea Running 32-bit Applications. |
Bloqueo de la recolección de elementos no utilizados
Cuando Common Language Runtime llama a ciertos métodos de la interfaz ICorProfilerCallback, el motor en tiempo de ejecución no puede realizar una recolección de elementos no utilizados hasta que el generador de perfiles devuelve el control de esa llamada. Esto se debe a que los servicios de generación de perfiles no siempre pueden construir la pila en un estado seguro para la recolección de elementos no utilizados. En su lugar, se deshabilita la recolección de elementos no utilizados alrededor de esa devolución de llamada. En estos casos, el generador de perfiles debe devolver el control lo antes posible. Esta situación se aplica a las siguientes devoluciones de llamada:
ICorProfilerCallback::ExceptionOSHandlerEnter, ICorProfilerCallback::ExceptionOSHandlerLeave
ICorProfilerCallback::ExceptionUnwindFunctionEnter, ICorProfilerCallback::ExceptionUnwindFunctionLeave
ICorProfilerCallback::ExceptionUnwindFinallyEnter, ICorProfilerCallback::ExceptionUnwindFinallyLeave
ICorProfilerCallback::ExceptionCatcherEnter, ICorProfilerCallback::ExceptionCatcherLeave
ICorProfilerCallback::ExceptionCLRCatcherFound, ICorProfilerCallback::ExceptionCLRCatcherExecute
ICorProfilerCallback::COMClassicVTableCreated, ICorProfilerCallback::COMClassicVTableDestroyed
Además, las devoluciones de llamada siguientes permiten al generador de perfiles bloquear la recolección de elementos no utilizados, llamada por llamada, utilizando el parámetro fIsSafeToBlock:
Tenga en cuenta que si el generador de perfiles se bloquea, retrasará la recolección de elementos no utilizados. Este retraso no es perjudicial siempre que el generador de perfiles no llame a una función de CLR que desencadene una recopilación de elementos no utilizados o asigne espacio en el montón administrado.