J'essaie d'utiliser l'utilitaire perfmon windows pour déboguer les fuites de mémoire dans un processus.
Voici comment perfmon explique les termes:
L'ensemble de travail est la taille actuelle, en octets, de l'ensemble de travail de ce processus. Le Working Set est l'ensemble des pages mémoire touchées récemment par les threads du processus. Si la mémoire disponible sur l'ordinateur dépasse un seuil, les pages restent dans le jeu de travail d'un processus même si elles ne sont pas utilisées. Lorsque la mémoire disponible tombe en dessous d'un seuil, les pages sont supprimées des ensembles de travail. S'ils sont nécessaires, ils seront ensuite réinstallés dans le groupe de travail avant de quitter la mémoire principale.
Octets virtuels est la taille actuelle, en octets, de l'espace d'adressage virtuel utilisé par le processus. L'utilisation de l'espace d'adressage virtuel n'implique pas nécessairement l'utilisation correspondante du disque ou des pages de mémoire principale. L'espace virtuel est limité et le processus peut limiter sa capacité à charger des bibliothèques.
Octets privés est la taille actuelle, en octets, de la mémoire que ce processus a alloué qui ne peut pas être partagé avec d' autres processus.
Ce sont les questions que j'ai:
Est-ce les octets privés que je devrais mesurer pour être sûr que le processus présente des fuites, car il n'implique aucune bibliothèque partagée et, le cas échéant, des fuites proviendront du processus lui-même?
Quelle est la mémoire totale consommée par le processus? S'agit-il des octets virtuels ou est-ce la somme des octets virtuels et de l'ensemble de travail?
Existe-t-il une relation entre les octets privés, l'ensemble de travail et les octets virtuels?
Existe-t-il d'autres outils qui donnent une meilleure idée de l'utilisation de la mémoire?
Réponses:
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:
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.
la source
Vous ne devez pas essayer d'utiliser perfmon, le gestionnaire de tâches ou tout autre outil de ce type pour déterminer les fuites de mémoire. Ils sont bons pour identifier les tendances, mais pas grand-chose d'autre. Les chiffres qu'ils rapportent en termes absolus sont trop vagues et agrégés pour être utiles pour une tâche spécifique telle que la détection de fuite de mémoire.
Une réponse précédente à cette question a donné une grande explication de ce que sont les différents types.
Vous posez des questions sur une recommandation d'outil: je recommande le validateur de mémoire. Capable de surveiller des applications qui font des milliards d'allocations de mémoire.
http://www.softwareverify.com/cpp/memory/index.html
Avertissement: j'ai conçu le validateur de mémoire.
la source
La définition des compteurs perfmon a été rompue depuis le début et, pour une raison quelconque, semble trop difficile à corriger.
Un bon aperçu de la gestion de la mémoire Windows est disponible dans la vidéo " Mysteries of Memory Management Revealed " sur MSDN: il couvre plus de sujets que nécessaire pour suivre les fuites de mémoire (par exemple la gestion des ensembles de travail) mais donne suffisamment de détails dans les sujets pertinents.
Pour vous donner un aperçu du problème avec les descriptions des compteurs perfmon, voici l'histoire intérieure des octets privés de " Compteur de performances des octets privés - Attention! " Sur MSDN:
Dans " Planification des performances " sur MSDN:
la source
Il y a une discussion intéressante ici: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/307d658a-f677-40f2-bdef-e6352b0bfe9e/ Ma compréhension de ce fil est que la libération de petites allocations est ne se reflète pas dans les octets privés ou l'ensemble de travail.
Longue histoire courte:
si j'appelle
alors les octets privés reflètent uniquement l'allocation, pas la désallocation.
si j'appelle
alors les octets privés reflètent correctement l'allocation et la désallocation.
la source