2009-07-22 18 views
7

Tengo una memoria de larga duración de un programa experimental, y me gustaría saber su huella de memoria real. El Administrador de tareas dice (en windows7-64) que la aplicación consume 800 mb de memoria, pero la cantidad total de memoria asignada, también según el administrador de tareas, es de 3.7 gb. La suma de toda la memoria asignada no es igual a 3.7 gb. ¿Cómo puedo determinar, sobre la marcha, cuánta memoria está consumiendo realmente mi aplicación?¿Cuánta memoria usa realmente mi aplicación de Windows?

Corolario: ¿Qué memoria está informando realmente el administrador de tareas? No parece ser todo el recuerdo asignado a la aplicación en sí.

Respuesta

2

Según tengo entendido, el administrador de tareas muestra el conjunto de trabajo;

conjunto de trabajo: El conjunto de páginas de memoria recientemente tocadas por los hilos de un proceso de . Si la memoria libre en la computadora está por encima de un umbral, las páginas quedan en el conjunto de trabajo de un proceso , incluso si no están siendo utilizadas . Cuando la memoria libre cae por debajo del umbral , las páginas se recortan del conjunto de trabajo .

través http://msdn.microsoft.com/en-us/library/cc432779(PROT.10).aspx

Usted puede obtener el Administrador de tareas para mostrar la memoria virtual también.

Normalmente uso perfmon (Inicio -> Ejecutar ... -> perfmon) para seguir el uso de la memoria, usando el contador de bytes privados. Refleja la memoria asignada por sus asignadores normales (nuevo/HeapAlloc/malloc, etc.).

+0

@Kim: Entonces, no es una buena forma t o saber cuánta memoria se asigna a una aplicación en particular, entonces, cuánto se ha tocado 'recientemente', para un valor dado de 'recientemente' – mmr

+0

Esa es la idea, sí. –

+0

@Kim: ¡Parece que Perfmon es lo que necesito, gracias! – mmr

0

Eso depende de qué memoria está hablando. Lamentablemente, hay muchas maneras diferentes de medir la memoria. Por ejemplo ...

  • memoria física asignada
  • memoria virtual asignada
  • memoria virtual reservado (pero no comprometidos)
  • Bytes privados
  • Bytes compartidos

Qué son métrica te interesa?

Creo que a la mayoría de la gente le interesa la categoría "Memoria virtual asignada".

+0

¿Eso se debe a que normalmente no se puede controlar cuando la memoria se intercambia en el disco? parece que la Memoria Física Asignada es la que causa los problemas. No estoy seguro de esta interrelación yo mismo ... – RedFilter

+0

@OrbMan, no estoy seguro de la primera parte. No contaría con alguna API existente que dice "por favor no intercambie esta página de memoria" Pero no sé de ninguna mano – JaredPar

+0

@JaredPar: estoy interesado en la cantidad de espacio de direcciones de 64 bits que se ha asignado, no necesariamente en el lugar donde se obtuvo esa memoria Al igual que en, ¿cuántos y qué tan grandes son mis matrices? ¿Cometí un error al no eliminar una o dos de las que creía que ya tenía? – mmr

2

La memoria es algo difícil de medir. Una aplicación puede reservar lotes de virtual memory pero no usar gran parte de ella. Parte de la memoria puede ser compartida; es decir, una DLL compartida puede cargarse en el espacio de direcciones de varias aplicaciones, pero solo se carga una vez en la memoria física.

Una buena medida es working set, que es el conjunto de páginas en su espacio de direcciones virtuales a las que se ha accedido recientemente. El significado de "acceso reciente" depende del sistema operativo y su page replacement algorithm. En otras palabras, es el conjunto real de páginas virtuales que están mapeadas en la memoria física y que están en uso en este momento. Esto es lo que te muestra el administrador de tareas.

El uso de la memoria virtual es la cantidad de páginas virtuales que se han reservado (tenga en cuenta que no todas se habrán comprometido realmente, es decir, que se asignó una copia de seguridad física. Puede agregar esto a la pantalla administrador de tareas haciendo clic ver -> Seleccionar columnas

lo más importante, sin embargo:. Si desea medir realmente la cantidad de memoria programa está utilizando para ver si usted necesita para optimizar algunas de ellas por el espacio o elija mejores estructuras de datos o persista algunas cosas en el disco, usar el administrador de tareas es el enfoque equivocado. Casi seguramente debería estar usando un generador de perfiles.

+0

Eventualmente podría usar un generador de perfiles, pero quiero ver cuánta memoria se está utilizando sin la ralentización del generador de perfiles en la aplicación en sí. Eventualmente, será necesario, pero solo por el aquí y ahora de cuánta memoria se está consumiendo realmente, parece que perfmon es la herramienta adecuada. – mmr

0

Las estadísticas de memoria mostradas por el administrador de tareas no son casi todas las estadísticas disponibles, ni están particularmente bien presentadas. Utilizaría la gran herramienta gratuita de Microsoft Sysinternals, VMMap, para analizar aún más la memoria utilizada por la aplicación.

Si se trata de una aplicación de larga ejecución, y el uso de la memoria aumenta con el tiempo, va a ser el montón que está creciendo. Algunas partes del montón pueden ser o no paginadas en el disco en cualquier momento, pero realmente necesita optimizar el uso de su pila. En este caso, debe ser el perfil de su aplicación. Si es una aplicación .Net, entonces puedo recomendar el generador de perfiles ANTS de Redgate. Es muy fácil de usar. Si se trata de una aplicación nativa, Intel Ptune Profiler es bastante poderoso. No necesita el código fuente para el proceso que está perfilando para cualquiera de las herramientas.

Ambas aplicaciones tienen una versión de prueba gratuita. Buena suerte.

P.S. Lo siento, no incluí más hipervínculos a las herramientas, pero esta es mi primera publicación, y stackoverflow limita las primeras publicaciones a un hipervínculo :-(

Cuestiones relacionadas