¿Qué son los bytes privados, los bytes virtuales, el conjunto de trabajo?


Estoy intentando usar la utilidad de windows perfmon para depurar fugas de memoria en un proceso.

Así es como perfmon explica los términos:

Working Set 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 el ordenador 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 se necesitan, se devolverán al conjunto de trabajo antes de salir de la memoria principal.

Virtual Bytes es el tamaño actual, en bytes, del espacio de direcciones virtuales que el proceso está utilizando. El uso del espacio de direcciones virtuales no implica necesariamente el uso correspondiente de las páginas de disco o de 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 la memoria que este proceso ha asignado y que no se puede compartir con otros procesos.

Estas son las preguntas que tengo:

¿Son los Bytes Privados los que debo medir para estar seguro de que el proceso tiene alguna fuga, ya que no implica ninguna biblioteca compartida y cualquier fuga, si ocurre, vendrá del proceso en sí?

¿Cuál es la memoria total consumida por el proceso? ¿Son los Bytes virtuales o es la suma de Bytes Virtuales y Conjunto de Trabajo?

¿Existe alguna relación entre Bytes Privados, Conjuntos de Trabajo y Bytes Virtuales?

¿Hay otras herramientas que den una mejor idea del uso de la memoria?

Author: Jeffmagma, 2009-12-31

4 answers

La respuesta corta 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 fuga de memoria.

Los bytes privados se refieren a la cantidad de memoria que el ejecutable del proceso tiene pidió - no necesariamente la cantidad que está realmente usando. Son "privados" porque (por lo general) 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 bytes privados se debió al ejecutable en sí, o a una biblioteca vinculada. Los bytes privados también son no exclusivamente memoria física; se pueden paginar en disco o en la lista de páginas en espera (es decir, ya no están en uso, pero tampoco se paginan todavía).

El Conjunto de trabajo se refiere a la memoria total física 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 medición aún menos precisa que los bytes privados. Este es el mismo valor que se informa en el Administrador de tareas "Uso Mem" y ha sido la fuente de infinitas cantidades 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 error de página; sin embargo, la lista de páginas en espera es también todavía físicamente en memoria, pero no reportado en el Conjunto de trabajo, y esta es la razón por la que puede ver el "Uso de Mem" caer repentinamente cuando se minimiza una aplicación.

Los bytes virtuales son el total espacio 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 (DLL compartidos), pero también incluye datos en la lista de espera y datos que ya se han paginado y se encuentran en un archivo de página en el disco en algún lugar. El total de bytes virtuales utilizados por cada proceso en un sistema bajo carga pesada sumará significativamente más memoria de la que la máquina realmente tiene.

Así que las relaciones son:

  • Los bytes privados son lo que su aplicación realmente ha asignado, pero incluyen el uso del archivo de página;
  • El conjunto de trabajo son los bytes privados no paginados más archivos mapeados en memoria;
  • Los Bytes Virtuales son el Conjunto de Trabajo más los Bytes Privados paginados y la lista de espera.

Hay otro problema aquí; así como compartido las bibliotecas pueden asignar memoria dentro de su módulo de aplicación, lo que conduce a posibles falsos positivos reportados 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 conduce a falsos negativos. Eso significa que en realidad es posible que su aplicación tenga una fuga de memoria que nunca se manifieste en los Bytes Privados. Improbable, pero posible.

Los bytes privados son una aproximación razonable de la cantidad de memoria que su ejecutable está utilizando y se puede utilizar para ayudar a reducir una lista de posibles candidatos para una fuga de memoria; si ve el número creciendo y creciendo constantemente e interminablemente, querrá comprobar que el proceso de una fuga. Esto no puede, sin embargo, probar que hay o no una fuga.

Una de las herramientas más efectivas para detectar / corregir fugas de memoria en Windows es en realidad Visual Studio (el enlace va a la página sobre usar VS para fugas de memoria, no la página del producto). Rational Purify es otra posibilidad. Microsoft también tiene un documento de mejores prácticas más general sobre este tema. Hay más herramientas listadas en esta pregunta anterior.

¡Espero que esto aclare algunas cosas! Rastrear las fugas de memoria es una de las cosas más difíciles de hacer en la depuración. Buena suerte.

 434
Author: Aaronaught,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:38

No debe intentar usar perfmon, administrador de tareas o cualquier herramienta como esa para determinar las fugas 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 fugas de memoria.

Una respuesta anterior a esta pregunta ha dado una gran explicación de cuáles son los diversos tipos.

Preguntas sobre una recomendación de herramienta: Recomiendo el Validador de Memoria. Capaz de supervisión de aplicaciones que generan miles de millones de asignaciones de memoria.

Http://www.softwareverify.com/cpp/memory/index.html

Descargo de responsabilidad: Diseñé el Validador de memoria.

 9
Author: Stephen Kellett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-05 17:25:51

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 visión general de la administración de memoria de Windows está disponible en el video "Misterios de la Gestión de la Memoria Revelados" en MSDN: Cubre más temas de los necesarios para rastrear fugas de memoria (por ejemplo, administración de conjuntos de trabajo), pero da suficiente detalle en los temas relevantes.


Para darle una pista del problema con el contador perfmon descripciones, aquí está la historia interna sobre los bytes privados de "Contador de Rendimiento de Bytes Privados Beware ¡Cuidado!" en MSDN:

P: ¿Cuándo un Byte Privado no es un Byte Privado?

A: Cuando no es residente.

El contador de Bytes privados informa de la carga de confirmación del proceso. Es decir, la cantidad de espacio que se ha asignado en el archivo de intercambio para contener el contenido de la memoria privada en caso de que se intercambie. Nota: Estoy evitando la palabra "reservado" debido a la posible confusión con la memoria virtual en el estado reservado que no está comprometido.


Desde "Planificación del Desempeño" en MSDN:

3.3 Bytes privados

3.3.1 Descripción

Memoria privada, se define como la memoria asignada a un proceso que no puede ser compartida por otros procesos. Esta memoria es más cara que la memoria compartida cuando se ejecutan varios de estos procesos en una máquina. La memoria privada en dlls (tradicionales) no administradas generalmente constituye una estática de C++ y es del orden del 5% del conjunto total de trabajo de la dll.

 7
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-25 15:58:54

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 la liberación de pequeñas asignaciones no se reflejan en Bytes Privados o Conjunto de Trabajo.

Larga historia corta:

Si llamo

p=malloc(1000);
free(p);

Entonces los Bytes Privados reflejan solo la asignación, no la desasignación.

Si llamo

p=malloc(>512k);
free(p);

Entonces los Bytes Privados reflejan correctamente la asignación y desasignación.

 5
Author: mcanti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-28 08:39:55