La réponse courte à cette question est qu'aucune de ces valeurs n'est un indicateur fiable de la quantité de mémoire qu'un exécutable utilise réellement, et aucune d'entre elles n'est vraiment appropriée pour déboguer une fuite de mémoire.
Les octets privés font référence à la quantité de mémoire que l'exécutable du processus a demandée - pas nécessairement la quantité qu'il utilise réellement . Ils sont "privés" car ils excluent (généralement) les fichiers mappés en mémoire (c'est-à-dire les DLL partagées). Mais - voici le hic - ils n'excluent pas nécessairement la mémoire allouée par ces fichiers . Il n'y a aucun moyen de savoir si un changement d'octets privés était dû à l'exécutable lui-même ou à une bibliothèque liée. Les octets privés ne sont pas non plus exclusivement de la mémoire physique; ils peuvent être paginés sur disque ou dans la liste des pages de secours (c'est-à-dire qu'ils ne sont plus utilisés, mais pas encore paginés non plus).
L'ensemble de travail fait référence à la mémoire physique totale (RAM) utilisée par le processus. Cependant, contrairement aux octets privés, cela inclut également les fichiers mappés en mémoire et diverses autres ressources, c'est donc une mesure encore moins précise que les octets privés. Il s'agit de la même valeur qui est signalée dans «Mem Usage» du Gestionnaire des tâches et a été la source de quantités infinies de confusion ces dernières années. La mémoire dans l'ensemble de travail est "physique" dans le sens où elle peut être adressée sans défaut de page; cependant, la liste des pages en attente est également physiquement en mémoire mais n'est pas signalée dans le jeu de travail, et c'est pourquoi vous pouvez voir «l'utilisation de Mem» tomber soudainement lorsque vous réduisez une application.
Les octets virtuels sont l' espace d'adressage virtuel total occupé par l'ensemble du processus. C'est comme l'ensemble de travail, dans le sens où il inclut des fichiers mappés en mémoire (DLL partagées), mais il inclut également des données dans la liste de secours et des données qui ont déjà été paginées et qui se trouvent quelque part dans un fichier d'échange sur le disque. Le nombre total d'octets virtuels utilisés par chaque processus sur un système soumis à une charge élevée ajoutera beaucoup plus de mémoire que la machine n'en a réellement.
Les relations sont donc:
- Les octets privés sont ce que votre application a réellement alloué, mais incluent l'utilisation du fichier d'échange;
- L'ensemble de travail correspond aux octets privés non paginés et aux fichiers mappés en mémoire;
- Les octets virtuels sont l'ensemble de travail plus les octets privés paginés et la liste de secours.
Il y a un autre problème ici; tout comme les bibliothèques partagées peuvent allouer de la mémoire à l'intérieur de votre module d'application, conduisant à des faux positifs potentiels signalés dans les octets privés de votre application , votre application peut également finir par allouer de la mémoire à l'intérieur des modules partagés , conduisant à des faux négatifs . Cela signifie qu'il est en fait possible que votre application ait une fuite de mémoire qui ne se manifeste jamais du tout dans les octets privés. Peu probable, mais possible.
Les octets privés sont une approximation raisonnable de la quantité de mémoire utilisée par votre exécutable et peuvent être utilisés pour réduire une liste de candidats potentiels pour une fuite de mémoire; si vous voyez le nombre augmenter et croître constamment et sans cesse, vous voudrez vérifier ce processus pour une fuite. Cela ne peut cependant pas prouver qu'il y a ou non une fuite.
L'un des outils les plus efficaces pour détecter / corriger les fuites de mémoire dans Windows est en fait Visual Studio (le lien va à la page sur l'utilisation de VS pour les fuites de mémoire, pas la page du produit). Rational Purify est une autre possibilité. Microsoft a également un document de bonnes pratiques plus général sur ce sujet. D'autres outils sont répertoriés dans cette question précédente .
J'espère que cela clarifie certaines choses! La recherche des fuites de mémoire est l'une des choses les plus difficiles à faire lors du débogage. Bonne chance.