2008-12-23 28 views
10

Estoy trabajando en una pequeña aplicación de administración de marcadores escrita en C#, usando WPF. Simplemente se encuentra en la bandeja del sistema y está inactivo el 99% del tiempo. Recientemente busqué en el administrador de tareas y descubrí que usa alrededor de 25 megas de memoria (y alrededor de 12 megas antes de que se active por primera vez), lo que pensé que era demasiado para una aplicación que no hace nada la mayor parte del tiempo. Eso me hizo preguntarme si hay alguna forma de reducir el uso de la memoria, por ejemplo, deshabilitando las funciones de WPF que son opcionales.Cómo reducir el uso de memoria de una aplicación WPF

He descubierto un hecho que podría conducir a algo, aunque no conozco ninguna forma de aprovecharlo. Los hilos en .NET toman alrededor de un meg cada uno, y resulta que mi aplicación usa alrededor de 6/12 hilos (antes y después de ser activada por primera vez). Esto representa la mitad del uso de mi memoria, lo cual es bastante significativo. No engendro ningún hilo nuevo directamente, pero no tengo idea de cómo WPF, así como otras partes de .NET, usan hilos para diferentes tareas, por lo que me resulta difícil hacer algo al respecto. Usar eventos para cosas que no están directamente relacionadas con la GUI, ¿esto, por ejemplo, genera nuevos hilos?

Supongo que mi pregunta es doble, ¿cómo se puede reducir el uso de memoria de las aplicaciones .NET/WPF en general y cómo se puede minimizar el número de hilos que se generan? Tenga en cuenta que no estoy pensando tanto en pequeños detalles como los que aparecen en this answer, sino más bien cómo diseñar para el uso de poca memoria en toda su aplicación.

Respuesta

5

Desafortunadamente, en mi experiencia, ~ 25MB es el más bajo que he visto para pequeñas aplicaciones WPF que he hecho, al menos en Windows XP. Creo que incluso las aplicaciones WPF de plantillas vacías toman ~ 20MB. ¿En qué SO se está ejecutando?

Windows Vista es una historia mejor, y probablemente pueda esperar ~ 13-15MB para una aplicación WPF de plantilla vacía.

Para que su aplicación use 6-12 hilos y solo use ~ 25MB, yo diría que lo está haciendo bastante bien. :-)

+1

Estoy ejecutando Vista de 64 bits. Para ser honesto, no es realmente algo de lo que me preocupe demasiado. Es decir, con los precios actuales del hardware, la memoria es prácticamente gratis, es casi factible agrupar cada copia de mi programa con una tarjeta de memoria de 2 gb.) –

+0

Te preocuparás si te piden que lo optimices en servicios de terminal, administrador de servidor don No quiero ver 30 procesos inactivos perder alrededor de 1 GB de ram. –

+0

también te preocupará cuando haya muchas otras aplicaciones similares en ejecución, cada una con mucha RAM. Es como las carreteras, construyes más carreteras y acabas con más congestión, compras más RAM y encuentras que tu caja aún necesita más. – gbjbaanb

5

Si se trata de una aplicación de bandeja de sistema, podría tener esa parte del programa implementada en WinForms (o incluso C++) y solo generar la aplicación WPF cuando el usuario hace doble clic en su icono. De esta forma, solo pagas por la memoria cuando realmente la estás usando.

1

No estoy seguro de si esto ayuda, pero en MS Visual C++, el tamaño de pila predeterminado es de 1 MB, y se puede configurar lo que quiera con una opción de compilación. Obviamente, las aplicaciones de C# heredaron este tamaño predeterminado (por lo que cada subproceso lleva al menos 1 MB). Pero parece que no hay forma de configurarlo cuando lo hago "csc /?"

0

Es un hecho de las aplicaciones .NET/Java que el CLR/JVM será allocate a larger heap memory then actually needed/used. Por lo general, están menos dispuestos a lanzar asignada al sistema operativo a menos que el sistema operativo esté teniendo memoria física hambrienta.

Pero es verdad que memory-management is a difficult topic. El problema es: ¿cómo se define el memory usage por su aplicación? Total memoria virtual asignada? conjunto de trabajo total? ¿conjunto de trabajo privado? memoria utilizada en montón? montón asignado? mínimo, pico o promedio?

Una cosa que puede hacer es usar CLR Profiler para comprobar si hay demasiado montón asignado. Puede tratar de optimizarlo gastando memoria consumiendo tomas por tiempos para evitar que el montón brille demasiado.

Cuestiones relacionadas