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



Answers

No debe intentar utilizar perfmon, el administrador de tareas o cualquier herramienta como esa para determinar pérdidas de memoria. Son buenos para identificar tendencias, pero no mucho más. Las cifras que informan en términos absolutos son demasiado vagas y agregadas para ser útiles para una tarea específica, como la detección de fugas de memoria.

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

Pregunta acerca de una recomendación de herramienta: Recomiendo Validador de memoria. Capaz de monitorear aplicaciones que hacen miles de millones de asignaciones de memoria.

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

Descargo de responsabilidad: diseñé Memory Validator.

Question

Estoy tratando de 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 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 Conjuntos de trabajo. Si se necesitan, se volverán a introducir fallas suaves 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 del disco o de las páginas principales de la memoria. 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 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 debería medir para estar seguro de si el proceso está teniendo alguna fuga, ya que no involucra ninguna biblioteca compartida y cualquier fuga, si ocurre, vendrá del proceso mismo?

¿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?

¿Hay alguna relación entre Bytes privados, Working Set y Bytes virtuales?

¿Hay alguna otra herramienta que brinde una mejor idea del uso de la memoria?




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 de la administración de memoria de Windows está disponible en el video " Misterios de la administración de memoria revelada " en MSDN: cubre más temas de los necesarios para rastrear fugas de memoria (por ejemplo, administración de conjuntos de trabajo) pero brinda suficientes detalles sobre los temas relevantes.

Para darle una pista del problema con las descripciones del contador PerfMon, aquí está la historia interna sobre bytes privados de " Contador de rendimiento de Bytes privados: ¡cuidado! " En MSDN:

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

A: cuando no es residente.

El contador Private Bytes informa el cargo de compromiso del proceso. Es decir, la cantidad de espacio que se ha asignado en el archivo de intercambio para contener los contenidos de la memoria privada en caso de que se cancele. Nota: Estoy evitando la palabra "reservado" debido a una posible confusión con la memoria virtual en el estado reservado que no está comprometido.

Desde " Planificación del rendimiento " en MSDN:

3.3 Bytes privados

3.3.1 Descripción

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






Links