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:
- Bytes privados son lo que su aplicación realmente ha asignado, pero incluyen el uso de archivos de paginación;
- Working Set son los Bytes privados no paginados más los 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 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.