.net - recolección - recoleccion de basura miami dade
¿Hay un evento para cuando se produce la recolección de basura en.NET? (5)
¿Monitoras perf-mon? Puede ver la CPU, en general y por proceso, la memoria .NET, incluido el tamaño de cada una de las generaciones y los recuentos de los tipos de GC. También puede dejar que perf-mon se ejecute y se registre durante períodos prolongados para observar las tendencias. ¡Encuentro que esto es mucho más útil que lo discreto que está sucediendo en este momento! eventos.
Tengo una desaceleración extraña en mi sitio web ASP.NET que parece que no puedo rastrear. Sospecho que GC podría estar dando patadas y deteniendo mis hilos. Para estar seguro, sería bueno iniciar sesión cada vez que se produzca GC.
Podría hacer un objeto ficticio y hacer el registro en su finalizador, pero eso sería una solución única, mientras que en mi caso hay varias pausas inexplicables.
¿Algunas ideas?
Agregado: El entorno es VS2008 / .NET 3.5 SP1. Y no, las notificaciones de recolección de basura no funcionarán porque son un método de votación y no funcionan para un GC concurrente.
Es posible que desee leer este artículo sobre la supervisión del rendimiento de ASP.NET y cuándo alertar a los administradores
Incluye una sección sobre los GCcounters para ver y lo que significan los valores. Por ejemplo
% De tiempo en GC. El porcentaje de tiempo dedicado a realizar la última recolección de basura. Un valor promedio de 5% o menos se consideraría saludable, pero los picos más grandes que esto no son infrecuentes. Tenga en cuenta que todos los hilos están suspendidos durante una recolección de basura.
También es posible que desee echar un vistazo al blog. Si está roto, respóngalo. Debería tener una serie de estudios de casos que van paso a paso sobre cómo identificar un problema específico. Por ejemplo, estudio de caso ASP.NET: CPU alta en GC: objetos grandes y altas tasas de asignación
La respuesta simple es "No, no hay ''eventos'' GC ''solo la función GCNotificación''. Sin embargo, usted crea una clase contenedora que escuchará GCNotification
y esa envoltura puede disparar eventos, pero no hay una solución de evento simple como la que está buscando.
La razón de esto es que un evento puede o no procesarse antes de que se complete el GC. Entonces, lo que tienen que hacer es engendrar un hilo hijo, dormir en WaitForFullGCApproach
o pole si no está buscando un GC completo, y hacer lo que sea necesario antes de que ocurra el GC.
Perhpas este artículo (Notificaciones de recolección de basura) ayudará.
se le puede notificar que se acerca una recolección de basura completa
Aquí hay un truco simple. Puede que no sea 100% exacto, pero probablemente sea lo suficientemente bueno.
Si puede vivir con la notificación de la finalización, entonces hay un método simple que puede usar.
Crea un objeto y no guardes una referencia al mismo. Cuando el objeto está finalizado, levantas tu evento y luego construyes otro objeto. Tampoco guarda una referencia a este objeto, pero seguirá vivo hasta la próxima vez que se realice una recopilación completa.
Aquí hay tal objeto:
public class GCNotifier
{
public static event EventHandler GarbageCollected;
~GCNotifier()
{
if (Environment.HasShutdownStarted)
return;
if (AppDomain.CurrentDomain.IsFinalizingForUnload())
return;
new GCNotifier();
if (GarbageCollected != null)
GarbageCollected(null, EventArgs.Empty);
}
public void Start()
{
new GCNotifier();
}
}
Si lo desea, puede agregar soporte para detenerlo al tener un campo booleano estático que le impide reiniciarse en la siguiente finalización.
Espero que esto sea de alguna ayuda.