Pregunta

Tengo una aplicación WindowsForms que aparece a perder memoria, por lo que utiliza HORMIGAS memoria de perfiles de Redgate para observar los objetos que sospechoso y se encontró que sólo están en manos de los objetos que ya están en el Finalizer cola . Grande, exactamente lo que es un Finalizer cola? ¿Me puede apuntar a la mejor definición? ¿Puede compartir algún consejo anecdótica?

Además, todas las raíces GC objetos en la cola Finalizer son instancias de System.Windows.Forms.Control + ThreadMethodEntry objetos denominados "llama". Veo que está implicado en la interacción de interfaz de usuario multi-hilo, pero no sé mucho más allá de eso. Perdona mi aparente pereza y la ignorancia admitido, pero estos recursos están enterrados dentro del componente de un proveedor. Estoy hablando con el vendedor acerca de estos temas, pero necesito una cierta dirección para conseguirme al tanto de la conversación. ¿Me puede apuntar a la definición más útil de ThreadMethodEntry también? Cualquier consejo anecdótica?

Además, debería incluso estar preocupado por estos objetos en la cola finalizador?

Actualización: Este artículo Red Gate era útil.

¿Fue útil?

Solución

La cola finalizador contiene todos los objetos que tienen un método finalizador definido. Recordemos que un finalizador es un medio para recolectar recursos no administrados como asas. Cuando el recolector de basura recoge la basura, que se mueve cualquier objeto con un finalizador en la cola de finalizador. En algún momento tarde-- en función de la presión de memoria, la heurística de GC, y la fase de la moon-- cuando el recolector de basura decide recoger estos objetos, que camina por la cola y se ejecutan las finalizadores.

Después de haber trabajado con pérdidas de memoria en el pasado, ver a un montón de objetos de su proveedor en la cola finalizador podría ser el código descuidado, pero no indica una pérdida de memoria. Por lo general, un buen código expondrá un método Dispose que recogerá tanto los recursos administrados y no administrados, y al hacerlo, retirarse de la cola a través de finalizador GC.SuppressFinalize(). Por lo tanto, si los objetos del vendedor hacen poner en práctica un método Dispose, y su código no lo llama, que podría dar lugar a un montón de objetos en la cola finalizador.

¿Ha intentado crear una instantánea en las hormigas entre dos puntos en el tiempo y la comparación de los objetos creados entre ellos? Eso puede ayudar a identificar los objetos gestionados se filtraron.

Además, si usted quiere ver si la memoria desaparece cuando se ejecutan los finalizadores, intente esto sólo para probar con:

System.GC.Collect();
System.GC.WaitForPendingFinalizers(); // this method may block while it runs the finalizers
System.GC.Collect();

No recomiendo ejecutar este código normalmente. Es posible que desee ejecutarlo si usted acaba de hacer un montón de trabajo y ha creado un montón de basura. Por ejemplo, en nuestra aplicación, una de nuestras funciones pueden crear alrededor de 350 MB de basura que va a la basura después de cerrar una ventana MDI. Desde que se sabe que dejar un montón de basura, que forzar manualmente la recolección de basura.

Tenga en cuenta también que hay una caché de propiedades de bajo nivel en el código Windows.Forms base que aferrarse a la última abierta de diálogo modal. Esto podría ser una fuente de una pérdida de memoria. Una forma segura de deshacerse de esta referencia es forzar a otro diálogo sencillo a aparecer, a continuación, ejecute el código GC anteriormente.

Otros consejos

La cola finalizador es una cola donde las instancias de objetos que no se utilizan ya están esperando a ser finalizado por el GC. Todos los objetos de esta cola se finalizarán y sus pérdidas de memoria, probablemente, no viene de uno de estos directamente. Sin embargo, uno de estos objetos no pueden liberar todos sus recursos no administrados.

La clase ThreadMethodEntry es una de las implementaciones y IAsyncResult instancias de esta clase se crean normalmente cuando se invoca operaciones asíncronas, como el uso de invocación para actualizar la interfaz de usuario o mediante Comience * / * Fin métodos.

Aquí está una buena entrada en el blog que describe un problema similar. A un nivel más técnico, usted podría mirar a la utilización de Sos.dll (que la entrada de blog describe) y Sosex.dll para ayudarle a entender por qué estos objetos ThreadMethodEntry están dando vueltas en la memoria. Hay comandos en estas extensiones WINDBG que puede rastrear a lo que otros objetos hacen referencia a un objeto específico en la memoria.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top