web-dev-qa-db-fra.com

Compteurs Perfmon pour vérifier les fuites de mémoire

Je souhaite vérifier le problème de fuite de mémoire dans mon service. J'ai essayé de suivre l'ensemble de compteurs perfmon.

  1. Mémoire .NET CLR\# octets dans tous les tas
  2. Mémoire .NET CLR\Taille de segment de mémoire Gen 2
  3. Mémoire .NET CLR\# GC gère
  4. Mémoire .NET CLR\# d'objets épinglés
  5. Mémoire .NET CLR\# total d'octets validés
  6. Mémoire .NET CLR\# total d'octets réservés
  7. Mémoire .NET CLR\Taille du tas d'objets volumineux

J'ai fait référence ci-dessus à partir de ici

Également appelé ensemble suivant:

  1. Mémoire/octets disponibles
  2. Mémoire/octets validés
  3. Processus/octets privés
  4. Octets de fichier de processus/page
  5. Nombre de processus/poignée

J'ai fait référence ci-dessus à partir de ici

Existe-t-il des paramètres/critères ou tout autre meilleur moyen d'identifier le compteur de perfmon pour les fuites de mémoire?
Quelqu'un peut-il me suggérer un ensemble de compteurs pour vérifier la fuite de mémoire? Ou au-dessus des ensembles couvre les fuites de mémoire?

21
CSharp

Pour détecter une fuite de mémoire à l'aide de l'Analyseur de performances, surveillez ces compteurs:

  1. Le compteur Mémoire/Octets disponibles vous permet de visualiser le nombre total d'octets de mémoire disponible. Cette valeur fluctue normalement, mais si vous avez une application avec la fuite de mémoire, elle diminuera avec le temps.
  2. Le compteur de mémoire/octets validés augmentera régulièrement en cas de fuite de mémoire, car à mesure que le nombre d'octets de mémoire disponibles diminue, le nombre d'octets validés augmente.
  3. Le compteur Process/Private Bytes affiche le nombre d'octets réservés exclusivement pour un processus spécifique. Si une fuite de mémoire se produit, cette valeur aura tendance à augmenter régulièrement.
  4. Le compteur Process/Page File Bytes affiche la taille du fichier d'échange. Windows utilise la mémoire virtuelle (le fichier d'échange) pour compléter la mémoire physique d'une machine. Lorsque la mémoire physique d'une machine commence à se remplir, les pages de mémoire sont déplacées vers le fichier d'échange. Il est normal que le fichier d'échange soit utilisé même sur des machines avec beaucoup de mémoire. Mais si la taille du fichier d'échange augmente régulièrement, c'est un bon signe qu'une fuite de mémoire se produit.
  5. Je veux également mentionner le compteur de processus/nombre de poignées. Les applications utilisent des descripteurs pour identifier les ressources auxquelles elles doivent accéder. En cas de fuite de mémoire, une application crée souvent des descripteurs supplémentaires pour identifier les ressources mémoire. Une augmentation du nombre de poignées peut donc indiquer une fuite de mémoire. Cependant, toutes les fuites de mémoire n'entraîneront pas une augmentation du nombre de poignées.

Source

D'après mon expérience, c'est exact.

Je vous renvoie également à ce blog Microsoft Advanced Debugging de Tess, un employé de Microsoft. Qui suggère les compteurs suivants. J'ai trouvé que ce qui précède est plus que suffisant pour indiquer qu'une fuite de mémoire est présente, mais j'espère que les instructions de Tess pourraient fournir un aperçu plus approfondi du problème.

Débogage des démos - Examen de la mémoire

  • Mémoire .NET CLR/# octets dans tous les tas
  • Mémoire .NET CLR/Taille du tas d'objets volumineux
  • Mémoire .NET CLR/taille de segment de mémoire Gen 2
  • Mémoire .NET CLR/taille de segment de mémoire Gen 1
  • Mémoire .NET CLR/taille de segment Gen 0
  • Processus/octets privés
  • Processus/octets virtuels
30
Amicable

Il existe de meilleurs outils disponibles pour faciliter le test des fuites de mémoire, tels que RedGate ANTS Memory Profiler et JetBrains dotMemory Profiler .

Cependant, si vous souhaitez utiliser des compteurs de performances, cet article explique comment utiliser les compteurs de performances pour tester les fuites de mémoire.

Gardez à l'esprit que Garbage Collection ne libère pas de mémoire immédiatement après la suppression d'une instance. Il a été optimisé pour déclencher et libérer de la mémoire uniquement en cas de stress mémoire. Donc, si vous souhaitez tester les fuites de mémoire, vous devez exécuter le nettoyage de la mémoire manuellement avant de prendre des lectures de compteur.

GC.Collect();
GC.WaitForPendingFinalizers();

enter image description here

4
CharithJ