Estoy tratando de usar la utilidad perfmon windows para depurar fugas de memoria en un proceso.
Así es como perfmon explica los términos:
El conjunto de trabajo es el tamaño actual, en bytes, del conjunto de trabajo de este proceso. El conjunto de trabajo es el conjunto de páginas de memoria tocadas recientemente por los hilos en el proceso. Si la memoria libre en la computadora está por encima de un umbral, las páginas se dejan en el Conjunto de trabajo de un proceso, incluso si no están en uso. Cuando la memoria libre cae por debajo de un umbral, las páginas se recortan de los conjuntos de trabajo. Si son necesarios, volverán a aparecer en el conjunto de trabajo antes de abandonar la memoria principal.
Bytes virtuales es el tamaño actual, en bytes, del espacio de direcciones virtuales que utiliza el proceso. El uso del espacio de direcciones virtuales no implica necesariamente el uso correspondiente de las páginas del disco o de la memoria principal. El espacio virtual es finito y el proceso puede limitar su capacidad de cargar bibliotecas.
Bytes privados es el tamaño actual, en bytes, de memoria que este proceso ha asignado que no se puede compartir con otros procesos.
Estas son las preguntas que tengo:
¿Son los Bytes privados los que debo medir para asegurarme de que el proceso tenga fugas, ya que no involucra bibliotecas compartidas y, si ocurre, alguna fuga vendrá del proceso en sí?
¿Cuál es la memoria total consumida por el proceso? ¿Son los bytes virtuales o la suma de los bytes virtuales y el conjunto de trabajo?
¿Existe alguna relación entre bytes privados, conjunto de trabajo y bytes virtuales?
¿Hay otras herramientas que dan una mejor idea del uso de la memoria?
Respuestas:
La respuesta breve a esta pregunta es que ninguno de estos valores es un indicador confiable de cuánta memoria está usando realmente un ejecutable, y ninguno de ellos es realmente apropiado para depurar una pérdida de memoria.
Los bytes privados se refieren a la cantidad de memoria que ha solicitado el ejecutable del proceso , no necesariamente a la cantidad que realmente está utilizando . Son "privados" porque (generalmente) excluyen archivos mapeados en memoria (es decir, archivos DLL compartidos). Pero, aquí está el truco, no necesariamente excluyen la memoria asignada por esos archivos . No hay forma de saber si un cambio en los bytes privados se debió al ejecutable en sí, o debido a una biblioteca vinculada. Bytes privados son también no la memoria exclusivamente física; se pueden paginar en el disco o en la lista de páginas en espera (es decir, ya no se usan, pero tampoco se paginan).
Conjunto de trabajo se refiere a la memoria física total (RAM) utilizada por el proceso. Sin embargo, a diferencia de los bytes privados, esto también incluye archivos mapeados en memoria y varios otros recursos, por lo que es una medida aún menos precisa que los bytes privados. Este es el mismo valor que se informa en el "Uso de memoria" del Administrador de tareas y ha sido fuente de un sinfín de confusión en los últimos años. La memoria en el conjunto de trabajo es "física" en el sentido de que se puede abordar sin un fallo de página; sin embargo, la lista de páginas en espera también se encuentra físicamente en la memoria, pero no se informa en el Conjunto de trabajo, y es por eso que puede ver que el "Uso de memoria" cae repentinamente cuando minimiza una aplicación.
Los bytes virtuales son el espacio total de direcciones virtuales ocupado por todo el proceso. Esto es como el conjunto de trabajo, en el sentido de que incluye archivos mapeados en memoria (archivos DLL compartidos), pero también incluye datos en la lista de espera y datos que ya han sido paginados y están en un archivo de paginación en algún lugar del disco. El total de bytes virtuales utilizados por cada proceso en un sistema bajo una carga pesada se sumarán a una cantidad significativamente mayor de memoria que la máquina realmente tiene.
Entonces las relaciones son:
Hay otro problema aquí; así como las bibliotecas compartidas pueden asignar memoria dentro del módulo de su aplicación, lo que puede generar falsos positivos potenciales informados en los Bytes privados de su aplicación , su aplicación también puede terminar asignando memoria dentro de los módulos compartidos , lo que lleva a falsos negativos . Eso significa que es posible que su aplicación tenga una pérdida de memoria que nunca se manifiesta en los Bytes privados. Improbable, pero posible.
Los bytes privados son una aproximación razonable de la cantidad de memoria que está utilizando su ejecutable y pueden usarse para ayudar a reducir una lista de posibles candidatos para una pérdida de memoria; Si ve que el número crece y crece constantemente y sin cesar, querrá verificar que el proceso no tenga fugas. Sin embargo, esto no puede probar que haya o no una fuga.
Una de las herramientas más efectivas para detectar / corregir pérdidas de memoria en Windows es en realidad Visual Studio (el enlace va a la página sobre el uso de VS para detectar pérdidas de memoria, no la página del producto). La purificación racional es otra posibilidad. Microsoft también tiene un documento de mejores prácticas más generales sobre este tema. Hay más herramientas enumeradas en esta pregunta anterior .
¡Espero que esto aclare algunas cosas! Rastrear pérdidas de memoria es una de las cosas más difíciles de hacer en la depuración. Buena suerte.
fuente
No debe intentar utilizar perfmon, el administrador de tareas ni ninguna herramienta como esa para determinar las pérdidas de memoria. Son buenos para identificar tendencias, pero no mucho más. Los números que informan en términos absolutos son demasiado vagos y agregados para ser útiles para una tarea específica, como la detección de pérdidas de memoria.
Una respuesta previa a esta pregunta ha dado una gran explicación de cuáles son los distintos tipos.
Pregunta sobre una recomendación de herramienta: recomiendo Memory Validator. Capaz de monitorear aplicaciones que realizan miles de millones de asignaciones de memoria.
http://www.softwareverify.com/cpp/memory/index.html
Descargo de responsabilidad: diseñé el Validador de memoria.
fuente
La definición de los contadores de perfmon se ha roto desde el principio y, por alguna razón, parece ser demasiado difícil de corregir.
Una buena descripción general de la administración de memoria de Windows está disponible en el video " Misterios de la administración de memoria revelados " en MSDN: cubre más temas de los necesarios para rastrear las pérdidas de memoria (por ejemplo, la administración del conjunto de trabajo) pero proporciona detalles suficientes en los temas relevantes.
Para darle una pista del problema con las descripciones del contador de perfmon, aquí está la historia interna sobre bytes privados de " Private Bytes Performance Counter - Beware! " En MSDN:
De " Planificación del rendimiento " en MSDN:
fuente
Aquí hay una discusión interesante: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Mi comprensión de este hilo es que liberar pequeñas asignaciones es no se refleja en Bytes privados o conjunto de trabajo.
Larga historia corta:
si llamo
entonces los Bytes privados reflejan solo la asignación, no la desasignación.
si llamo
entonces los Bytes privados reflejan correctamente la asignación y la desasignación.
fuente