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

Resuelto pankajt asked hace 14 años • 4 respuestas

Estoy intentando utilizar la utilidad perfmon de Windows para depurar pérdidas de memoria en un proceso.

Así es como perfmon explica los términos:

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 subprocesos del proceso. Si la memoria libre en la computadora supera 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, se les devolverá un fallo suave al 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 del disco o de las páginas de la memoria principal. El espacio virtual es finito y el proceso puede limitar su capacidad para cargar bibliotecas.

Bytes privados es el tamaño actual, en bytes, de 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 si el proceso tiene alguna fuga, ya que no involucra bibliotecas compartidas y cualquier fuga, si ocurre, provendrá del proceso mismo?

¿Cuál es la memoria total consumida por el proceso? ¿Son los bytes virtuales o es la suma de los bytes virtuales y el conjunto de trabajo?

¿Existe alguna relación entre bytes privados, conjunto de trabajo y bytes virtuales?

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

pankajt avatar Dec 31 '09 13:12 pankajt
Aceptado

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 pérdida de memoria.

Los bytes privados se refieren a la cantidad de memoria que el proceso ejecutable ha solicitado , no necesariamente la cantidad que realmente está utilizando . Son "privados" porque (normalmente) excluyen los archivos asignados en memoria (es decir, DLL compartidos). Pero (aquí está el problema) no necesariamente excluyen la memoria asignada por esos archivos . No hay forma de saber si un cambio en los bytes privados se debió al propio ejecutable o a una biblioteca vinculada. Los bytes privados tampoco son exclusivamente memoria física; se pueden paginar en el disco o en la lista de páginas en espera (es decir, ya no están en uso, pero tampoco paginadas todavía).

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 medición 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 infinita 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 que se produzca un error de página; sin embargo, la lista de páginas en espera también está físicamente en la memoria pero no se informa en el conjunto de trabajo, y es por eso que es posible que vea que el "Uso de memoria" disminuye 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 (DLL compartidos), pero también incluye datos en la lista de espera y datos que ya han sido paginados y se encuentran 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 carga pesada sumará significativamente más memoria de la que realmente tiene la máquina.

Entonces las relaciones son:

  • Los bytes privados son lo que su aplicación realmente ha asignado, pero incluyen el uso del archivo de paginación;
  • El conjunto de trabajo son los bytes privados no paginados más los archivos asignados 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 las bibliotecas compartidas pueden asignar memoria dentro del módulo de su aplicación, lo que genera posibles falsos positivos 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 genera 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 utiliza su ejecutable y pueden usarse para ayudar a reducir una lista de candidatos potenciales para una pérdida de memoria; Si ve que el número crece y crece de manera constante e interminable, querrá verificar ese proceso en busca de una fuga. Sin embargo, esto no puede demostrar 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 pérdidas de memoria, no a 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 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.

Aaronaught avatar Dec 31 '2009 18:12 Aaronaught

La definición de los contadores de rendimiento se ha roto desde el principio y por alguna razón parece 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 pérdidas de memoria (por ejemplo, administración de conjuntos de trabajo) pero brinda suficientes detalles en los temas relevantes.


Para darle una idea del problema con las descripciones de los contadores de rendimiento, aquí está la historia interna sobre los bytes privados de " Contador de rendimiento de bytes privados - ¡Cuidado! " en MSDN:

P: ¿Cuándo un byte privado no es un byte privado?

R: Cuando no es residente.

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


De " Planificación del rendimiento " en MSDN:

3.3 Bytes privados

3.3.1 Descripción

La 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 procesos de este tipo en una máquina. La memoria privada en archivos DLL no administrados (tradicionales) generalmente constituye estática de C++ y es del orden del 5% del conjunto de trabajo total del archivo DLL.

Mark avatar Nov 13 '2014 01:11 Mark