Ce qui est privé octets octets virtuels, jeu de travail?

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:

Travail est la taille, en octets, de l'Ensemble de Travail de ce processus. L'Ensemble de Travail est l'ensemble des pages de mémoire touché récemment par les threads du processus. Si la mémoire disponible de l'ordinateur est au-dessus d'un seuil, les pages sont laissées dans le Jeu de Travail d'un processus, même si ils ne sont pas en cours d'utilisation. Lorsque la mémoire libre tombe en dessous d'un seuil, les pages sont découpées à partir d'ensembles de travail. Si elles sont nécessaires, elles seront doux défectueuses dans le Jeu de Travail avant de quitter la mémoire principale.

Octets Virtuels est la taille, en octets, de l'espace d'adressage virtuel du 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 fini, et le le processus peut limiter sa capacité à charger des bibliothèques.

Bytes privés est la taille actuelle, en octets, de la mémoire que ce processus a attribuée et qui ne peut être partagée avec d'autres processus.

ce sont les questions que j'ai:

est-ce que c'est les octets privés que je devrais mesurer pour être sûr si le processus a des fuites car il n'implique pas de bibliothèques partagées et des fuites, si cela se produit, viendra le 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?

y a-t-il une relation entre les octets privés, les ensembles de travail et les octets virtuels?

y at-il d'autres outils qui donnent une meilleure idée de l'utilisation de la mémoire?

417
demandé sur Jeffmagma 2009-12-31 09:16:34

4 réponses

la réponse courte à cette question Est que aucune de ces valeurs n'est un indicateur fiable de la quantité de mémoire qu'un exécutable utilise réellement, et aucune n'est vraiment appropriée pour déboguer une fuite de mémoire.

Bytes privés se réfèrent à la quantité de mémoire que l'exécutable de processus a demandé pour - pas nécessairement la quantité il est réellement en utilisant . Ils sont "privés" parce qu'ils (habituellement) excluent les fichiers mappés en mémoire (c.-à-d. les DLLs partagés). Mais-voici le hic - ils n'excluent pas nécessairement la mémoire attribuée par ces fichiers . Il n'y a aucun moyen de dire si un changement dans les octets privés était dû à l'exécutable lui-même, ou à une bibliothèque liée. Les octets privés sont aussi et non exclusivement mémoire physique; ils peuvent être Pagés vers le disque ou dans la liste de la page d'attente (c'est-à-dire qu'ils ne sont plus utilisés, mais pas mais soit).

Working Set renvoie au total mémoire (mémoire vive) physique utilisé par le procédé. Cependant, contrairement aux bytes privés, Cela inclut également les fichiers cartographiés en mémoire et diverses autres ressources, de sorte que c'est une mesure encore moins précise que les bytes privés. C'est la même valeur qui est rapportée dans "L'Usage Mem" du Gestionnaire de tâches et qui a été la source de beaucoup de confusion au cours des dernières années. La mémoire dans la Working Set est " physique "dans le sens où il peut être traité sans problème de page; cependant, la liste de la page en attente est aussi toujours physiquement en mémoire mais pas signalé dans l'ensemble de travail, et c'est pourquoi vous pourriez voir le" Mem Usage " chute soudainement quand vous minimisez une application.

Octets virtuels sont le total espace d'adresse virtuel occupé par le processus entier. C'est comme le travail set, dans le sens où il inclut des fichiers mappés en mémoire (DLLs partagés), mais il inclut également des données dans la liste de secours et des données qui a déjà été bipé et est assis dans un pagefile sur le disque quelque part. Le nombre total d'octets virtuels utilisés par chaque processus sur un système soumis à une lourde charge ajoutera beaucoup plus de mémoire que la machine n'en a réellement.

de Sorte que les relations sont les suivantes:

  • les octets privés sont ce que votre application a réellement
  • Travailler Ensemble est la non-paginé Octets Privés en plus des fichiers mappés en mémoire;
  • les octets virtuels sont L'ensemble de travail plus les octets privé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 l'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 pour votre application d'avoir une fuite de mémoire qui ne se manifeste jamais dans les octets privés du tout. Peu probable, mais possible.

les octets privés sont raisonnables approximation de la quantité de mémoire que votre exécutable utilise et peut être utilisé pour aider réduire une liste de candidats potentiels pour une fuite de mémoire; si vous voyez le nombre croissant et croissant constamment et sans fin, vous voudriez vérifier ce processus pour une fuite. Cela ne peut pas, cependant, 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 (lien va à la page sur L'utilisation VS pour les fuites de mémoire, pas la la page produit). Rationnel Purifier est une autre possibilité. Microsoft a également un plus général meilleures pratiques document sur ce sujet. Il y a d'autres outils énumérés dans cette question précédente .

j'espère que cela éclaircira quelques choses! Traquer les fuites de mémoire est l'une des choses les plus difficiles à faire dans le débogage. Bonne chance.

434
répondu Aaronaught 2017-05-23 12:34:38

vous ne devez pas essayer d'utiliser perfmon, Gestionnaire des tâches ou tout autre outil de ce genre pour déterminer les fuites de mémoire. Elles permettent de dégager des tendances, mais pas grand-chose d'autre. Les nombres 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 fuites 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 demandez à propos d'une recommandation d'outil: Je je recommande le validateur de mémoire. Capable de surveiller les applications qui font des milliards d'allocations mémoire.

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

clause de non-responsabilité: J'ai conçu le validateur de mémoire.

9
répondu Stephen Kellett 2010-02-05 17:25:51

la définition des compteurs perfmon a été brisée depuis le début et semble pour une raison ou une autre être trop difficile à corriger.

un bon aperçu de la gestion de la mémoire Windows est disponible dans la vidéo " mystères de la gestion de la mémoire révélé " sur MSDN: il couvre plus de sujets que nécessaire pour suivre les fuites de mémoire (par exemple la gestion des jeux de travail), mais donne suffisamment de détails dans les sujets pertinents.


pour vous donner une idée du problème avec les descriptions des compteurs perfmon, voici l'histoire interne sur les octets privés de" Compteur de Performance D'Octets privés -- attention! " sur MSDN:

Q: Quand un octet privé n'est-il pas un octet privé?

A: quand il n'est pas résident.

Le compteur Octets Privés des rapports de la validation chargée de la procédure. C'est-à-dire, la quantité d'espace qui a été attribué dans le fichier d'échange sur le contenu de la mémoire privée dans le cas où il est échangé. Note: j'évite le mot "réservé" à cause d'une possible confusion avec la mémoire virtuelle dans l'état réservé qui n'est pas engagée.


De " la Planification de la Performance " sur MSDN:

3.3 Octets Privés

3.3.1 Description

mémoire privée, est définie comme mémoire attribuée à un processus qui ne peut pas être partagée par d'autres processus. Cette mémoire est plus chère que la mémoire partagée lorsque plusieurs processus de ce type s'exécutent sur une machine. La mémoire privée dans les dlls (traditionnels) non gérés constitue généralement de C++ statique et est de l'ordre de 5% de l'ensemble de travail de la dll.

7
répondu Mark 2016-01-25 15:58:54

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 ne sont pas reflétées dans les octets privés ou les ensembles de travail.

pour faire court:

si j'appelle

p=malloc(1000);
free(p);

les octets privés ne reflètent alors que l'attribution et non la désallocation.

si j'appelle

p=malloc(>512k);
free(p);

puis les octets privés reflètent correctement l'attribution et la désallocation.

5
répondu mcanti 2011-04-28 08:39:55