2011-04-22 5 views
10

He estado solucionando algunas pérdidas de memoria en mi aplicación WPF. Para hacerlo, utilicé el generador de perfiles CLR, así como también las estadísticas de los procesos en el Administrador de tareas de Windows. Mi prueba básica fue asegurarme de que cuando se cerraba cierta ventana, todavía no se quedaba en la memoria.¿Debo forzar manualmente la recolección de basura en mi aplicación WPF?

Soy un poco nuevo en el desarrollo de Windows, y al principio me confundí porque en una simple aplicación de prueba, parecía como si no importara qué, mis ventanas siempre permanecían en la memoria después de cerradas. Pero finalmente me di cuenta de que esto no significaba que había una pérdida de memoria, sino simplemente que aún no se habían recogido basura. Así que tuve que crear un botón en mi ventana principal conectado a un controlador de eventos que contenía código para forzar manualmente la recolección de basura. Recolectando manualmente la basura, pude completar mis pruebas de pérdida de memoria, y lo tengo todo ordenado.

Pero me hizo pensar - ¿Hay alguna vez una necesidad de forzar manualmente la recolección de basura?

Me duele ver cómo el consumo de memoria de mi aplicación aumenta y aumenta a medida que abro y cierro ventanas. Por supuesto, finalmente, la recolección de basura se ejecuta automáticamente y todo se soluciona. Pero casi parece una buena idea recolectar manualmente basura después de que se cierran estas pesadas ventanas. Pero, ¿hay algún punto? Me da la sensación de que las pruebas de un lado, no se supone que forzar la recolección de basura, simplemente deje que el sistema lo resuelva.

Pensamientos apreciados.

Respuesta

9

Gracias por los comentarios chicos. ¡Aceptaré su consejo y dejaré que el sistema se ocupe de lo que el sistema fue diseñado para cuidar!

En realidad, he encontrado una buena respuesta a mi pregunta en un libro que tengo en .NET Framework.Dice:

El propósito de la basura .NET colector es la gestión de la memoria en nuestra nombre. Sin embargo, en algunas circunstancias muy raras , puede ser beneficioso para forzar sistemáticamente una recolección de basura utilizando GC.Collect(). Específicamente :

  • Cuando la aplicación está a punto de entrar en un bloque de código que usted no desea interrumpido por una posible recogida de basura .
  • Cuando su aplicación acaba de terminar la asignación de un número extremadamente grande de los objetos y de que deseen eliminar la mayor gran parte de la memoria adquirida tan pronto como sea posible .
5

Es una buena práctica que nunca fuerce la recolección de basura manualmente, en cualquier aplicación .NET. Se supone que GC es más inteligente que nosotros (y en realidad es inteligente). Desafortunadamente, si hay una fuga de memoria, incluso si se llama a la fuerza, el GC no ayuda.

+1

+1 para "si hay pérdida de memoria, incluso llamando a la fuerza el GC no ayuda". Ese es un muy buen punto ... los objetos filtrados no son candidatos para la recolección de basura. – NateTheGreat

3

Estoy de acuerdo con usted en ambos lados de su punto :-). En general, considero que las personas que escribieron el tiempo de ejecución .NET son más inteligentes que yo y tienen una mejor comprensión de la recolección de basura que yo, así que lo dejo en paz.

He visto algunos casos en que las personas pensaban que estaban haciendo bien al forzar la recolección de basura, pero nunca hubo ninguna evidencia sólida de que ayudara.

2

La única vez que uso GC.Collect es para averiguar rápidamente cuánta memoria está lista para ser recolectada.

De lo contrario, es inútil porque hasta ahora el GC es más inteligente que yo.

0

Si no puede usar la llamada manual GC.Collect, puede llamar manualmente al Dispose en los objetos más grandes cuando sabe que ha terminado con ellos, incluso si mantiene referencias en el código sin motivo (descuidado), al menos se llama a su destructor y (si se escribe mejor que el código descuidado antes mencionado) no debería ocupar realmente mucha memoria.

2

Creo que deberías leer este artículo: Secrets of WPF Memory Allocation. No se trata de su pregunta en absoluto, pero es valiosa para entender el comportamiento de WPF.

+0

+1 Artículo interesante. –

Cuestiones relacionadas